
this는 기본적으로 실행 컨텍스트가 생성될 때 함께 결정된다. this는 함수를 호출할 때 결정된다.

전역 공간에서는 var변수 대신 window프로퍼티에 직접 할당하더라도 결과적으로 var로 선언한 것과 똑같이 동작을 한다 . but, ‘삭제’의 명령에 대해선 다르다.
var a = 1;
delete window.a; //false
console.log(a,window.a,this,a) // 1 1 1
window.d = 4;
delete window.d; //true
console.log(d,window.d,this.d) // Uncaught referenceError: d is not defined
전역 변수로 선언한 경우 삭제가 되지 않는 이유는 사용자가 의도치 않게 삭제하는 것을 방지하기 위함?
→ 전역 변수를 선언하면 js 엔진이 자동으로 전역객체의 프로퍼티로 할당하면서 추가적으로 해당 프로퍼티의 configurable 속성을 false로 정의한다.
키와 값으로 형성된 실질적 값을 갖고있는 프로퍼티
1)value - 실제 프로퍼티 값
2)writable - 값을 수정 할 수 있는지 여부. false로 설정하면 프로퍼티 값을 수정 할 수 없다.
3)enumrable - 열거가 가능한지 여부이다. for...in 룹 등을 사용 할 수 있으면 true를 반환한다.
4)**configurable** - 프로퍼티 어트리뷰트의 재정의가 가능한지 여부를 판단한다.
false일 경우 프로퍼티 삭제나 어트리뷰트 변경이 금지된다.
단 writable이 true인 경우, 값 변경과 writable변경하는건 가능하다.const obj = {
name: '조인식',
main: function () {
setTimeout(() => {
console.log(this); //{ name: '조인식', main: [Function: main] }
}, 1000);
},
};
obj.main();
//this가 선언된 위치에서 결정. 바깥 lexical에 있는 this를 그대로 가져오기때문에.