함수가 호출될 때 결정되는 실행 컨텍스트가 생성될 때 함께 결정되는 this

this에는 호출한 주체에 대한 정보가 담긴다.

전역 공간에서의 this

전역 공간에서 this는 전역 객체이다. (browser : window, Node.js : global)

전역 공간의 특이한 성질

전역 변수 선언 > 전역객체의 프로퍼티로도 할당

var a =1 ;
console.log(a);
console.log(window.a);
console.log(this.a);

JS 엔진은 모든 변수를 어떤 특정 객체(실행 컨텍스트의 Lexical Environment)의 프로퍼티로 인식

  1. 실행 컨텍스트에서 변수를 수집하면 그걸 Lexical Environment에 넣는다.
  2. 변수를 호출할 시 L E를 조회해서 일치하는 프로퍼티가 있으면 반환
  3. 전역 컨텍스트의 경우 전역 객체를 그대로 참조
  4. 고로 전역 변수가 선언되면 LE에 전역 객체의 프로퍼티로 할당됨.

var a 에도 값이 나오는 이유는 스코프 체인 덕이다. 스코프 체인을 통해서 전역 스코프까지 가서 전역 객체에서 프로퍼티를 발견, 반환하게 되는 것이다.

따라서 window 객체에 할당하는거나 변수에 할당하는거나 비슷할 수 있다. 단, 제거할 때만 빼고

// 할당
window.a = 3;
var b= 4;
console.log(a,window.a,this.a); //333
console.log(b,window.b,this.b); //444

// 제거
window.a = 3;
delete a;
console.log(a,window.a,this.a) // ReferenceError : a is not defined

var a = 3;
delete a;
console.log(a,window.a,this.a) // 3 3 3

window 객체로 할당해야만 delete로 사라지는 것을 확인할 수 있다.

method로서 호출할 때 그 method 내부에서의 this

function vs method

일반 function method
독립적 비독립적(자신을 호출한 대상 객체에 관한 동작을 수행한다.)
.이 앞에 있다. (객체 앞에 프로퍼티로 쓰인 함수이다.)
this는 전역 자신을 호출한 객체

객체의 메서드로 호출할 경우에만 method라고 할 수 있다.