ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트 컨텍스트, 클로저
    JavaScript 2015. 3. 9. 15:24
    실행콘택스트
    • 함수를 실행할 때마다 새로운 콘택스트가 생성된다. 스택구조를 하고 있고 스택의 Top이 현재의 실행콘텍스트이다. (스택프레임 같은 것)
      • 함수외부(글로벌)의 자바스크립트 코드가 실행시 실행콘텍스트는 글로벌오브젝트이다. 
      • 함수내부의 자바스크립트 코드가 실행시 실행콘텍스트는 함수실행시에 생성된 Call오브젝트이다. 
    • 실행콘텍스트 == 글로벌/Call오브젝트 와 비슷?

     

     

    자바스크립트 : 클로저(Closures)
    자바스크립트의 클로저는 함수에 부모 함수의 범위에 대한 접근성을 제공한다. 개발자에게는 극히 혼란스러운 개념이다. 필자는 자바스크립트를 배울 당시 의도하지 않은 클로저로 인해 코드를 디버깅하는 데 몇 시간을 소비한 적이 있다. 이런 실수를 통해 배운 이후에는 클로저가 상당히 멋지다고 생각했고 다시 몇 시간 동안 클로저를 사용하여 문제를 해결하려 헛되이 노력하기도 했다.

    결국, 배운 것은 클로저는 부모 범위에 대한 접근성을 가진 안쪽 함수(아래 고차 함수 참조)를 반환할 때 유용하다는 점이다. 이로써 변수를 보관하기 위한 일종의 비공개, 또는 보호된 환경이 만들어진다. 아래 예에서 count는 threeTimer가 호출될 때 접근 및 증분되며, 점이나 괄호 기호를 통해 직접 접근할 수는 없다.

    // **Closures**
    function makeThreeTimer(){
    var count = 0;
    return function(){
    if(count < 3){
    console.log('doing work');
    count++;
    }
    else {
    throw new Error('No more work');
    }
    }
    }
    var threeTimer = makeThreeTimer();
    threeTimer(); // logs 'doing work' (count gets incremented)
    threeTimer(); // logs 'doing work' (count gets incremented)
    threeTimer(); // logs 'doing work' (count gets incremented)
    threeTimer(); // throws an error
    threeTimer.count; // returns undefined

Designed by Tistory.