서핑을 하다가 위의 자바스크립트 코드를 찾게 되었는데요. 이것을 보면 전역변수와 지역변수의 구분을 잘 알 수 있을 듯 싶네요.
가족이라는 전역함수와 전역변수를 만들었고, 그 안에 아버지와 어머니의 지역 함수를 만들었습니다.
먼저 가족() 이라는 전역함수를 실행시킵니다.
** 설명1)
function 가족() {
var a = '0';
document.writeln('가족(1):' + a); //0 (** 설명1)
...
...
}
전역변수인 a 에 값이 0 이 할당되었습니다. 그래서 그 다음 구문인 document.writeln(a) 는 0 이 출력되었죠.
**설명2)
var a = '0';
document.writeln('가족(1):' + a); //0 (** 설명1)
function 아버지() {
document.writeln('아버지(1):' + a); //undefined (** 설명2)
(function () {
document.writeln('아버지(2):' + a); //undefined (** 설명3)
a = '55';
})();
var a; //(** 특이사항)
document.writeln('아버지(3):' + a); //55 (** 설명4)
}
가족함수에서 아버지() 지역함수를 먼저 호출합니다. 아버지() 함수 안에 (** 특이사항) 이라고 표현한 부분이 있는데 여기에 전역변수 a 와 동일하게 기술되어 있습니다. 아버지() 지역함수는 지역변수인 var a; 에 적용을 받게 됩니다. 변수만 설정 되었지만 값이 없네요. 그래서 값이 undefined 입니다.
만약에 (** 특이사항) 이라고 기술한 var a; 를 제거하면 어떻게 될까요?? 지역변수가 없으므로 전역변수 a 의 값을 찾게 됩니다. 그로 인해 출력이 0 이 되겠죠. 여기선 var a; 지역변수가 존재하므로 undefined 로 출력됩니다.
자동실행 함수이네요. 여기도 지역변수 var a; 로 인해 출력이 undefined 라 출력됩니다. 그 다음 구문은 a = 55; 이네요. 이제 a 라는 지역변수에 값이 55가 할당된 겁니다.
**설명4)
function 아버지() {
.....
(function () {
document.writeln('아버지(2):' + a); //undefined (** 설명3)
a = '55';
})();
var a; //(** 특이사항)
document.writeln('아버지(3):' + a); //55 (** 설명4)
}
자동실행 함수 안의 a = '55'; 로 인해 출력이 55가 됩니다.
**설명5)
function 가족() {
var a = '0';
document.writeln('가족(1):' + a); //0 (** 설명1)
.....
function 어머니() {
document.writeln('어머니(1):' + a); //0 (** 설명5)
a = '50';
document.writeln('어머니(2):' + a); //50
//var a;
}
}
이제 어머니() 함수를 호출하게 되네요. 어머니는 함수 내부에 var a; 같은 지역변수가 없습니다. 따라서 스코프영향으로 가족() 전역함수 안의 전역변수의 값을 찾게 됩니다. 값은 0 이 출력되겠죠. 중요한것은 아버지() 지역함수 내의 지역변수 a 값은 아버지() 지역함수 안에서만 적용된다는 점입니다. 만약에 어머지() 지역함수안에 아버지() 지역함수처럼 var a; 이 존재한다면 undefined 출력이 되겠죠...
**설명5) 어머니() 지역함수에서 변경한 전역변수의 a = '50'; 할당해서 전역변수값이 변경되어 50이 출력됩니다.