함수와 객체(메소드)의 구분이 느슨한 자바스크립트에서, this는 실질적으로 이 둘을 구분하는 거의 유일한 기능이다.
상황에 따라 달라지는 this
this
는 기본적으로 실행 컨텍스트
가 생성될 때 함께 결정된다.,
바꿔 말하면, this
는 함수를 호출할 때
결정된다.
전역공간
전역 컨텍스트
를 생성하는 주체가 전역 객체
이기 때문에, 전역 공간
에서 this
는 전역 객체
를 가리킨다.
브라우저 환경에서 전역 객체는 window
이고, Nods.js 환경에서는 global
이다.
//전역공간에서의 this (브라우저 환경)
console.log (this) //{ alert: f(), atob: f(), blur: f(), ... }
console.log(window) //{ alert: f(), atob: f(), blur: f(), ... }
console.log(this === window) //true
//전역공간에서의 this (Node.js 환경)
console.log(this) //{ process: { title: 'node', version: '', ... } }
console.log(global) //{ process: { title: 'node', version: '', ... } }
console.log(this === gloabal) //true
전역 공간에서는 var
로 변수를 선언하는 대신 window
의 프로퍼티에 직접 할당하더라도 결과적으로는 똑같이 동작한다.
var a = 1
window.b = 2
console.log(a, window.a, this.a) // 1 1 1
console.log(b, window.b, this.b) // 2 2 2
window.a = 3
b = 4
console.log(a, window.a, this.a) // 3 3 3
console.log(b, window.b, this.b) // 4 4 4
그러나 '삭제' 명령에 대해서는 전혀 다르게 작동한다.
var a = 1
delete window.a // false
delete a // false
console.log(a, window.a, this.a) // 1 1 1
window. b = 2, c = 3
delete window.b // true
delete c // true
console.log(b, window.b, this.b) // Uncaught ReferenceError: b is not defined
console.log(c, window.c, this.c) // Uncaught ReferenceError: c is not defined
처음부터 전역객체의 프로퍼티
로 할당한 경우에는 삭제가 되는 반면, 전역변수
로 선언한 경우에는 삭제가 되지 않는다.
사용자가 의도치 않게 삭제하는 것을 방지하는 차원의 방어 전략
으로 해석할 수 있다.