유효범위

유효범위(Scope)는 변수의 수명을 의미한다.

var vscope = 'global';
function fscope(){
    alert(vscope);
}
fscope();     

//global

함수 밖에서 변수를 선언하면 그 변수는 전역변수가 된다. 전역변수는 에플리케이션 전역에서 접근이 가능한 변수다. 다시 말해서 어떤 함수 안에서도 그 변수에 접근 할 수 있다.

var vscope = 'global';      // 전역변수 (자바 전역에서 접근)
function fscope(){
    var vscope = 'local';   // 지역변수 (함수 중괄로안 접근)
    alert('함수안 '+vscope);
}
fscope();
alert('함수밖 '+vscope);

/*
함수안 local
함수밖 global
*/
var vscope = 'global';
function fscope(){
    vscope = 'local'; 
}
fscope();
alert('함수밖'+vscope);

/* local
3scope의 지역변수를 선언할 때 var를 사용하지 않았기 때문이다.
var를 사용하지 않은 지역변수는 전역변수가 된다. */

지역변수의 유효범위는 함수 안이고, 전역변수의 유효범위는 에플리케이션 전역인데, 같은 이름의 지역변수와 전역변수가 동시에 정의되어 있다면 지역변수가 우선한다는 것을 알 수 있다.

변수를 선언할 때는 꼭 var을 붙이는 것을 습관화해야 한다. 전역변수를 사용해야 하는 경우라면 그것을 사용하는 이유를 명확히 알고 있을 때 사용하도록 하자.

유효범위의 효용

지역변수의 사용

function a (){
    var i = 0;
}
for(var i = 0; i < 5; i++){
    a();
    document.write(i);
}

// 01234

전역변수의 사용

function a (){
    i = 0;
}
for(i = 0; i < 5; i++){
    a();
    document.write(i);
}

// 무한반복

전역변수의 사용

불가피하게 전역변수를 사용해야 하는 경우는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용한다.

MYAPP = {}
MYAPP.calculator = {
    'left' : null,
    'right' : null
}
MYAPP.coordinate = {
    'left' : null,
    'right' : null
}
 
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
    return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());

// 30
(function(){
    var MYAPP = {}
    MYAPP.calculator = {
        'left' : null,
        'right' : null
    }
    MYAPP.coordinate = {
        'left' : null,
        'right' : null
    }
    MYAPP.calculator.left = 10;
    MYAPP.calculator.right = 20;
    function sum(){
        return MYAPP.calculator.left + MYAPP.calculator.right;
    }
    document.write(sum());
}())

전역변수를 사용하고 싶지 않다면 와 같이 익명함수를 호출함으로서 이러한 목적을 달성할 수 있다.

유효범위의 대상 (함수)

자바스크립트는 함수에 대한 유효범위만을 제공한다.

for(var i = 0; i < 1; i++){
    var name = 'coding everybody';
}
alert(name);

/*name은 지역변수로 for 문 안에서 선언 되었는데 
이를 for문 밖에서 호출하고 있기 때문이다.*/

자바스크립트의 지역변수는 함수에서만 유효하다.

정적 유효범위

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

var i = 5;              // 전
 
function a(){
    var i = 10;         // 지
    b();
}
 
function b(){
    document.write(i);  // 사용될 때 가 아닌 정의될 때의 전역 변수 사
}
 
a();

// 5

Last updated

Was this helpful?