ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] 스코프 scope (유효범위)
    To infinity/Javascript 이론 2021. 6. 10. 23:57

    작성일: 2021.06.10, Ver1

     

    1. 스코프란?

    - 기본적이고 중요한 내용임.

    - 자바스크립트의 스코프는 다른 언어의 스코프와 구별되는 특징이 있으므로 주의 (함수 레벨 스코프)

     

     

    특징을 범위설정방법과 검색규칙 두가지로 나눠보자.

     


    1) 식별자가 유효한 범위를 결정

    - 모든 식별자(변수이름, 함수이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 자신의 유효범위가 결정됨.

    (ex. 함수몸체 내에서 선언된 변수는 함수몸체 내에서만 유효. 변수는 가장 바깥영역, 코드블록, 함수몸체 내에서도 유효.)

     

     

    (1) 자바스크립트는 렉시컬 스코프 (lexical scope)임

     - 동적스코프(dynamic scope): 함수를 어디서 호출했는가에 따라 함수의 상위 스코프를 결정

     - 렉시컬스코프 또는 정적 스코프(static scope): 함수를 어디서 정의했는가에 따라 함수의 상위 스코프를 결정

     - 자바스크립트 및 대부분의 프로그래밍 언어는 렉시컬 스코프방식을 따름.

     

    (2) 스코프의 종류

    - 전역(global) : 코드 가장 바깥 영역 (like 왕)

    - 지역(local): 함수 몸체 내부 (like 영주)

     

    (3) 함수레벨 스코프

    -  함수에 의해서만 지역 스코프가 생성된다는 의미

    - 자바스크립트는 함수 레벨 스코프가 생성되나, 다른 언어들은 블록 레벨 스코프가 생성됨.

    그래서 자바스크립트 ES6에 도입된 let, const키워드는 블록 레벨 스코프를 지원한다.

     

    전역스코프와 지역스코프

     

     

    2) 스코프 체인을 통해 식별자 결정을 위해 검색할 때 사용하는 규칙

     

    (1) 스코프체인 scope chain

    - 스코프가 계층적으로 연결된 것

    즉, 실행 컨텍스트의 렉시컬 환경을 단방향으로 연결(chaining) 한 것

     

    - 중첩함수: 함수 몸체 내부에서 정의한 함수

    - 외부함수: 중첩함수를 포함하는 참수

    (외부함수의 지역스코프를 중첩함수의 상위스코프라고 부름.)

     

    - 자바스크립트 엔진이 동일한 식별자를 마주했을 때 스코프 체인을 통해 어떤 변수를 참조해야할지 결정.

    (마치, 법률에서 특별법이 일반법보다 우선하는 것 처럼.)

     

    - 상위 스코프 방향으로 이동하며 변수를 검색

    즉, 절대 하위방향으로 이동하지는 않기에 상위스코프에 사용한 변수는 하위스코프에서도 사용이 가능하다.

     

     

    (2)식별자 결정

    - 어떤 변수를 참조해야 하는가를 결정하는 것.

    - 스코프는 변수와 함수에 의해 영향을 받는다. 함수는 함수 호이스팅에 의해 선언될 때 암묵적으로 함수이름과 동일한 식별자를 선언하고 그에 함수객체를 할당하기 때문에 '변수를 검색한다'라고 안하고 '식별자를 검색한다'라고 말하는 것이 더 옳다.

     

    스코프 체인

     

     

    해당 글은 책, '모던 자바스크립트 DEEP DIVE'를 읽고 정리한 내용입니다.


    [참고]

    - var 같은 스코프 내에서 중복선언 가능

    - let, const 같은 스코프 내에서 중복선언 불가능

     

    [참고] 코드가 어디서(where) 실행되고 주변에 어떤(which) 코드가 있는지를 나타내는 자료구조를 렉시컬 환경이라고 함, 코드의 문맥은 렉시컬 환경에 의해 이뤄짐, 이를 구현한것이 실행 컨텍스트임 executio context


    2021.06.10, Ver1 Comment.

     

    책을 읽고 내용을 정리하는 건 너무 좋지만, 어떻게 하면 가독성이 좋고 누구나 읽어도 이해하기 쉬운 아름다운 글을 쓸 수 있을까까지 고려하기엔 현재로선 무리다. 개인특성 상 그렇게하면 시간이 너무 오래 걸리기 때문.

     

    지금은 책을 한번 개괄하는 단계이기에 시간이 생명이다. 따라서 현재 내가 이해한 내용을 바탕으로 구성 및 정리하였고 나중에 내가 봤을 때 개념을 다시 떠올릴 수 있는 정도로 요약했다. 추후 언제라도 내용의 가감 및 수정이 발생할 수 있기에 ver을 적어놓았다.

     

    혹시라도 이 글을 통해 쉬운 설명을 얻기 원해 들어오게 된 분이 있으시다면 다른 정리가 잘 된 글들을 추천드린다. 참고로 나는 생활코딩(https://opentutorials.org/course/743)을 추천한다.

Designed by Tistory.