(function() {varMYAPP= {}//함수 안의 변수가 되기 때문에 지역변수가 된다.MYAPP.calculator = {'left':null,'right':null}MYAPP.coordinate = {'left':null,'right':null}MYAPP.calculator.left =10;MYAPP.calculator.right =20;functionsum() {returnMYAPP.calculator.left +MYAPP.calculator.right;}document.write(sum());}();//함수 정의와 호출을 동시에 한다.)
함수 이름을 명명하고 호출해도 되지만, 함수를 호출할 때 변수 안에 함수가 들어가있는 것이기 때문에 결국 이것 자체가 전역변수가 되게 된다.
유효번위의 대상(함수)
자바스크립트는 함수에 대한 유효범위만을 제공한다. 즉, 함수 내에서 정의된 변수만이 지역변수이고, for문이나 if문에서 사용되는 변수는 전역변수의 의미이다.
for(var i =0; i <1;i++) {var name ='coding everybody';}alert(name);//실행 결과 : coding everybody
하지만, 자바에서는 허용되지 않는다. name은 지역변수로 for문 안에서 선언되었는데 이를 for문 밖에서 호출하고 있기 때문이다.
for(var i =0; i <1;i++) { String name ='coding everybody';}System.out.println(name);
정적 유효범위
자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다. 이러한 유효범위의 방식을 정적 유효범위(static scoping), 혹은 랙시컬(lexical scoping)이라고 한다.(클로저와 연관된 개념이다.)
아래의 코드에서 함수a 내에서 호출된 함수 b는 어떤 i값을 가져올 것인가?
자바스크립트의 정적 유효범위에 따라, 함수 b가 정의된 시점에서 전역변수 var i = 5; 의 5 값을 가져오게 된다. (함수가 사용될 때가 아니라 정의된 시점이다.)
var i =5;functiona (){var i =10;b();}functionb() {document.write(i);}a();