2.실행 컨텍스트

실행컨텍스트

클로저를 지원하는 대부분의 언어에서 이와같은 개념이 존재한다.

LexicalEnvironment

"현재 컨텍스트의 내부에는 a, b, c와 같은 식별자들이 있고 그 외부 정보는 D를 참조하도록 구성돼있다."
컨텍스트를 구성하는 환경 정보들을 사전에서 접하는 느낌으로 모아놓은 것이다.

호이스팅

매개변수와 변수에 대한 호이스팅

function a() { let x = 1; console.log(x) let x; console.log(x) let x = 2; console.log(x) } // 1, undefined, 2 가 아니라, // "1 , 1 , 2"로 출력 된다. // 변수선언을 먼저 가장 위로 끌어 올리고, 그다음 할당하고 console.log(x)가 찍히는 순서이다. // 1, let x -> let x -> let x // 2, x = 1 -> console.log(x) -> console.log(x) -> x = 2 -> console.log(x)

함수선언의 호이스팅

function a() { console.log(b) // undefined일거라고 생각이 들지만, function b()가 호출된다. 그 이유는 호이스팅 let b = 'bbb'; console.log(b); // 'bbb' function b(){ // 함수부분만 위로 끌어올리고 console.log(b) // 여기는 가만히 있는다. 'bbb'가 찍힌다. } } a(); // 1, let b; -> function b(){} (선언문 가장 위로 끌어올림) // 2, console.log(b) : function b() -> b = 'bbb' -> console.log(b) : 'bbb' -> function(b)의 console.log(b) : 'bbb'

상대적으로 함수 표현식이 안전하다.

const a = (x,y) => x+y

스코프 체인

let a = 1; let outer = function() { let inner = function () { console.log(a); let a = 3; } inner(); console.log(a); } outer(); console.log(a);