정적 스코프

렉시컬 스코프(Lexical Scope)라고도 불립니다. 렉시컬 특성을 활용한 스코프 방식입니다. 렉시컬 특성은 함수 실행 시 유효범위를 함수 정의 환경을 기준으로 하기 때문에 아래의 예제처럼 func1 함수에서 global 이 출력이 되었음을 확인할 수 있습니다.

var x = "global"
 
function func1() {
  var x = "local";
  func2();
}
 
function func2() {
  console.log(x);
}
 
func1();  // global
func2();  // global

동적 스코프

렉시컬 소코프가 소스코드가 작성된 그 문맥에서 결정된다고 하면, 동적 스코프는 프로그램의 런타임 도중의 실행 컨텍스트나 호출 컨텍스트에 의해 결정이 됩니다. 자바스크립트는 렉시컬 특성을 가지고 있습니다.

블록 스코프

자바스크립트는 기본적으로 함수 스코프를 지원하지만, 블록 스코프도 역시 지원한다.

  • with 역시 블록 스코프를 지원하지만 추가적인 스코프를 생성하는 추가적인 자원 소모가 있기 때문에 사용하지 말자.

  • try/catch 의 catch 부분에서 선언된 변수는 catch 블록 스코프에 속한다

try {
  f();
} catch(err) {
  console.log(err);
}
 
console.log(err);   // ReferenceError
  • let키워드(ES6)를 사용하면 선언된 변수를 둘러싼 블록의 스코프를 이용한다.

var foo = true;
 
if(foo) {
  {
    let bar = foo * 2;
    console.log(bar);
  }
}
 
console.log(bar);   // ReferenceError

중첩 스코프

중첩 스코프는 가장 인접한 지역을 우선하여 참조합니다.

var foo = function ( ) {
 
  var a = 2, b = 3;
 
  var bar = function ( ) {
    var b = 5, c = 6;
 
    // 이 시점에서 a는 2, b는 5, c는 6
 
    a += b + c;
 
    // 이 시점에서 a는 13, b는 5, c는 6
 
  };
 
  // 이 시점에서 a는 2, b는 3, c는 not defined
 
  bar( );
 
// 이 시점에서 a는 13, b는 3
};


'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 - 1 [스코프란 무엇일까?]  (0) 2017.07.21

+ Recent posts