ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스코프(Scope)와 실행 컨텍스트
    Front-end/Javascript 2021. 4. 8. 12:17

    스코프 : 변수를 저장하고 변수를 찾는 규칙 

    ES5까지의 자바스크립트는 전역공간을 제외하면 함수에 의해서만 스코프가 생성된다. (ES6에서는 블록스코프가 생겼다). 

    이러한 식별자의 유효범위를 안에서부터 바깥까지 차례로 검색하는것을 스코프 체인이라고 한다. ( LexicalEnvironmet의 outer) 

     

    엔진은 var a / a = 2 두개의 구문으로 본다. 

    1. var = a : 컴파일러는 렉싱을 통해 위의 구문을 토큰으로 쪼개고, 토큰을 파싱해 트리 구조로 만든다. 컴파일러는 a가 특정한 스코프 컬렉션안에 있다면 컴파일러는 선언을 하지않고, 스코프안에 존재하지 않으면 a를 스코프 컬렉션에 선언하라고 요청한다. 

    2. 그 후 컴파일러는 엔진이 a = 2 을 처리하기위해 실행할수있는 코드를 생성한다. 엔진은 스코프에 변수 a가 스코프에서 접근할수있는지 확인하고, 가능하면 변수 a를 사용하고 아니라면 엔진은 중첩 스코프에서 찾는다. 

    변수를 찾으면 변수에 값을 넣고, 못찾으면 에러가 발생할 것이다. 

    스코프에서 접근할수있는지 확인할때 수행하는 검색 : LHS 검색 (변수가 대입연산자 왼쪽에 있을때 수행. 대입할 대상) 

    실행 과정 : 엔진 => 스코프에 scope함수에 대한 RHS 참조 유무 요청 => scope함수가 있으니 scope함수 실행. a에대한 LHS 참조 ( a = 5 과정) 요청 => 컴파일러가 a를 scope의 인자로 선언함을 스코프에서 확인 => a의 RHS 참조 요청 => log에 넘기고 실행 => 결과값 5. 

     

    중첩 스코프

    하나의 블록이나 함수는 다른 블록이나 함수 안에 중첩될 수 있으므로 스코프도 다른 스코프 안에 중첩될 수 있다.

    변수를 현재 스코프에서 발견하지못하면 엔진은 바깥의 스코프로 넘어가거나 전역 스코프에 도달할때까지 계속한다. 

     

    실행 컨텍스트

    실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 이를 호출스택에 담고있다가, 마지막에 위치하는 코드들을 실행하면서 전체 코드의 환경과 순서를 보장한다. 실행 컨텍스트를 구성할 수 있는 방법은 전역공간,eval() 함수, 함수 등이 있으며 흔하게 실행컨텍스트를 구성하는 방법은 함수를 실행하는것이다.

     

     

    렉시컬 스코프

    일반적으로 자바스크립트에서 사용하는 방식이다. 렉시컬 스코프는 변수와 스코프 블록을 어디서 작성하냐에 따라서 렉서가 코드를 처리할때 확정된다. 자바스크립트에서 eval()과 with을 사용해서 렉시컬스코프를 수정하거나 새로운 렉시컬 스코프를 생성할 수 있으나, 코드가 느리게 동작하므로 사용하지는 않는다.

      - 렉시컬 속이기 

         함수 선언 위치에 따라 결정되는 렉시컬 스코프를 런타임때 수정할 수 있는 방법은 두가지가 있다. 

        1 ) eval (절대 사용하지 말 것)

    결과 : 1 3

        2 ) with 

     

     함수 / 블록 스코프 

    자바스크립트에서 함수는 스코프를 이루는 가장 흔한 다위다. 다른 함수 안에서 선언된 변수와 함수는 본질적으로 다른 스코프로부터 숨겨진 것이다.

    블록 스코프는 함수만이아니라 임의의 코드 블록에 변수와 함수가 속하는 개념이다. 블록 스코프는 var 함수 스코프를 완전히 대체할 수 없다. 

     

     

     

     

    출처 : You don't know js, 코어 자바스크립트 ,MDN 

     

     

     

    'Front-end > Javascript' 카테고리의 다른 글

    [강제변환]  (0) 2021.04.12
    변수의 선언과 호이스팅  (0) 2021.04.08
    특수값 (Undefined, void, NaN, Infinity, -0..)  (0) 2021.04.06
    숫자  (0) 2021.04.06
    프로토타입  (0) 2021.03.30
Designed by Tistory.