JS & TS/JavaScript

[JavaScript] scope, 실행 컨텍스트, strict mode

Bay Im 2024. 2. 8. 10:35
  • Global Object (전역 객체)
    • JS engine process 생성(시작) 시 맨 먼저 생성
    • BuiltIn(standard) propertoes & functions
    • host object(browser, node API) 및 var/function object도 보유
    • 전역 변수는 전역 객체에 영원히(process 종료시까지) 존재한다.
    • 직접 생성(컨트롤) 못하고 window(globalThis) 키워드 생략 가능
    • const/let은 전역 객체가 아닌 Declarative Enviroment Record에 별도 생성
    • 선언이 없는 식별자는 암묵적 전역으로 전역 객체에 등록된다. (ex. ig = 1;)
  • encode/decode URI
    • encodeURI(), decodeURI()
      • 서버가 인식할 수 있는 문자를 제외하고 encoding/decoding
    • encodeURIComponent(), decodeURIComponent()
      • 서버가 인식할 수 있는 문자까지 모조리 encoding/decoding
  • 렉시컬(Lexical) 스코프
    • Lexical Scope
      • Global Scope
      • Function Scope
      • Block Scope
      • Scope & Lexical Scope Chain
        • scope
          • 각 식별자들의 유효 범위
          • Global, Function(var/function), Block(const/let)
        • Lexical Scope Chain
          • 각 scope 별 Lexical Enviroment 생성되고 이들 hierarchy는 단방향으로 연결되어 있다.
          • 함수는 어디에서 정의했는지에 따라 상위 scope가 결정된다.
            • Static Scope: 정의된 위치 기반
            • Dynamic scope: 어디서 호출, 호출된 시간 기반
            • 동일 scope의 변수는 실행 시간이 가장 늦은 곳의 값이 최종 할당된다.
        • identifier resolution
          • 식별자를 찾아 떠나는 여행
          • local (function, block), scope(inner → outer) → global
            • 오른쪽으로 갈수록 변수의 생명주기는 길어진다. 전역변수 사용 자제하기
    • Module Scope
    • eval(string)

 

  • JS Execution Context
    • ExecutionContext(실행 컨텍스트)를 생성하는 Code의 분류
      • 전역, 함수, eval, module 코드는 각각의 실행 컨텍스트를 생성한다. 이들은 CallStack에 생성되므로 이를 Execution Context Stack이라 부른다.
    • LexicalEnvironment(렉시컬 환경)
      • 실행 컨텍스트가 참조하는 자료구조
    • Global
    • Function
    • ExecutionContext - LexicalEnvironment - EnvRec

 

  • strict(엄격) mode
    • 오해의 소지가 있는 구문을 문법적으로 명확하게 평가
    • hoisting은 동일하나 block내 함수는 block scope를 갖는다.
    • 'use strict';
  • strict mode의 특징
    • 선언하지 않은 식별자는 access(접근)할 수 없다.
    • 암묵적 전역(var, implicit global)은 허용하지 않는다.
    • delete로 선언된 변수, 함수, 매개변수를 삭제할 수 없다.
    • block내에서 var은 sloppy(느슨한) mode와 동일한 scope이지만, 함수는 block scope 이다.
    • 한 함수에서 parameter(매개변수) 이름이 동일하면 안된다.
    • NaN, Infinite 등의 전역 프로퍼티에 값을 할당하면 안된다.
    • ESM module은 strict mode로 실행된다.
  • Closure(클로저)
    • 상위 scope의 식별자를 참조하는 하위 scope(함수, 메서드)가 외부에서 지속적으로 참조되어 상위 scope 보다 저 오래 살아있는 것
  • Memoization
    • 반복되는 결과를 메모리에 저장하여 같은 결과가 사용될 때 저장한 값을 사용해 빠르게 실행하는 기법
728x90

'JS & TS > JavaScript' 카테고리의 다른 글

[JavaScript] Array  (0) 2024.02.08
[JavaScript] function  (0) 2024.02.08
[JavaScript] 할당, 구조분해할당  (0) 2024.02.08
[JavaScript] 형 변환, Hoisting  (0) 2024.02.08
[JavaScript] Javascript란?  (0) 2024.02.08