[JavaScript] 유효범위,정적 유효범위, 렉시컬 스코핑(Lexical Scoping)

자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다. 이러한 유효범위의 방식을 정적 유효범위(static scoping) = 렉시컬(lexical scoping)이라고 한다.


var i = 5;

function a(){
    var i = 10;
    b();
}

function b(){
    document.write(i);
}

a();

->실행 결과 값은 5이다.

*자바스크립트는 함수가 호출될때가아닌 선언된 즉 작성된위치에서의 변수를 참조하게되므로 위의 코드에서 전역변수를 참조하게되어 i는 전역변수인 var i = 5;를 참조하여 나타낸다.


var i = 5;

function a(){
    var i = 10;

    function b(){
        document.write(i);
    }

    b();
}
a();

-> 실행 결과 값은 10이다.


b함수가 선언된 시점이 a함수 안이므로, 1차적으로 b함수의 지역변수에 선언된 i를 찾아보고 없을경우 전역변수이자 a함수의 지역변수인 i를 참조하여 결과값 10을 가져오게된다. 

만약에 a함수 안에서도 var i = 10;이 선언되지 않았다면 결과값은 전역변수로 선언된 var i = 5;가 결과값으로 된다.


마지막으로 정리하면  함수는 사용될때가아닌 정의될때 참조할 변수가 전역변수인지 지역변수인지 정해지게된다. 이러한것을 정적 유효범위 혹은 렉시컬 스코핑이라고 부른다.

댓글