Scope

Scopes는 유효범위를 나타내며, 전역 유효 범위와 지역 유효범위로 나누어집니다.

자바스크립트의 유효범위란?

크게 아래의 특징이 있습니다.

함수 단위의 유효범위

블로 단위가 아닌 함수 단위로 유효 범위가 정의되기 때문에 아래의 a, b, c 변수는 모두 같은 유효범위를 갖습니다.

function A() {  
    var a = 0;
    if (true) {
        var b = 0;
        for (var c = 0; c < 5; c++) {
            console.log("c=" + c);
         }
         console.log("c=" + c);
    }
    console.log("b=" + b);
}
A();  

변수명 중복 허용

같은 변수명이 여러 개 있을 경우, 변수를 참조할 때 가장 가까운 범위의 변수를 참조합니다.

var scope = 10;  
function A(){  
    var scope = 20;
    console.log("scope = " +scope);
}
A();  

var 키워드의 생략

var 키워드를 빼먹고 변수를 선언할 경우 전역 변수로서 선언이 됩니다.

렉시컬 특성

렉시컬 특성이란 함수 실행 시 유효범위를 함수 실행 환경이 아닌 함수 정의 환경으로 참조하는 특성입니다.

아래 예제처럼 함수 정의될 때의 환경을 보기 때문에 변수 a를 찾을 수 없다는 에러 메시지가 출력됩니다.

function f1(){  
    var a= 10;
    f2();
}
function f2(){  
    return a;
}
f1();
 
// Error : a is not defined

아래 코드를 실행하게 되면 전역 전역 변수 a와 함수 변수 f가 정의가 됩니다. 그런 다음에 f()를 실행하면 함수 f가 호출되고 f 레벨의 파싱이 일어나게 됩니다. 이 파싱의 결과로 함수 내부에 있는 a가 변수 스포크 객체에 정의가 됩니다.

var a = 20;
function f(){  
    console.log(a); // 20
    var a = 10;
    console.lgo(a); // 10
}
 
f();


'Language > Javascript' 카테고리의 다른 글

promise - 2 [Promise 사용 시 주의할 것]  (0) 2017.07.28
promise - 1 [then, catch, resolve, reject]  (0) 2017.07.28
closure  (0) 2017.07.28
scope - 3 [변수 숨기기]  (0) 2017.07.28
Scope - 2 [정적, 동적, 블록, 중첩 스코프]  (0) 2017.07.21

+ Recent posts