π Chapter 3: this
π μν©μ λ°λΌ λ¬λΌμ§λ thisβ
- μλ°μ€ν¬λ¦½νΈμμ
this
λ κΈ°λ³Έμ μΌλ‘ μ€ν 컨ν μ€νΈκ° μμ±λ λ ν¨κ» κ²°μ λλ€. - μ€ν 컨ν
μ€νΈλ ν¨μλ₯Ό νΈμΆν λ μμ±λλ―λ‘, λ°κΏ λ§νλ©΄
this
λ ν¨μλ₯Ό νΈμΆν λ κ²°μ λλ€κ³ ν μ μλ€.
π μ μ 곡κ°μμμ thisβ
- μ μ 곡κ°μμ
this
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. μ μ κ°μ²΄λ λ°νμ νκ²½μ λ°λΌ λΈλΌμ°μ νκ²½μμ μ μκ°μ²΄λwindow
μ΄κ³Node.js
νκ²½μμλglobal
μ΄λ€.
// λΈλΌμ°μ
this === window
// Node.js
this === global
- μ μλ³μλ₯Ό μ μΈνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄λ₯Ό μ μκ°μ²΄μ νλ‘νΌν°λ‘λ ν λΉνλ€. λ³μμ΄λ©΄μ κ°μ²΄μ νλ‘νΌν°μ΄κΈ°λ νλ€.
var a = 1;
console.log(a); // 1
console.log(window.a); // 1
console.log(this.a); // 1
- μλ°μ€ν¬λ¦½νΈμ λͺ¨λ λ³μλ νΉμ κ°μ²΄μ νλ‘νΌν°λ‘μ λμνλ€.
var
μ°μ°μλ₯Ό μ΄μ©ν΄ λ³μλ₯Ό μ μΈνλλΌλ μ€μ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄λ€ νΉμ κ°μ²΄μ νλ‘νΌν°λ‘ μΈμνλ€. μ¬κΈ°μ νΉμ κ°μ²΄λ λ°λ‘ μ€ν 컨ν μ€νΈμLexicalEnvironment
μ΄λ€. μ€ν 컨ν μ€νΈλ λ³μλ₯Ό μμ§ν΄μLexicalEnvironment
μ νλ‘νΌν°λ‘ μ μ₯νλ€. μ΄ν μ΄λ€ λ³μλ₯Ό νΈμΆνλ©΄LexicalEnvironment
λ₯Ό μ‘°νν΄μ μΌμΉνλ νλ‘νΌν°κ° μμ κ²½μ° κ·Έ κ°μ λ°ννλ€. μ μ 컨ν μ€νΈμ κ²½μ°LexicalEnvironment
λ μ μκ°μ²΄λ₯Ό κ·Έλλ‘ μ°Έμ‘°νλ€. (μ ννλGlobalEnv
λ₯Ό μ°Έμ‘°) - μ μλ³μλ₯Ό μ μΈνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄λ₯Ό μ μκ°μ²΄μ νλ‘νΌν°λ‘ ν λΉνλ€.
- μ¬κΈ°μ
a
λ§ νΈμΆνμ¬λ 1μ΄ λμ€λ μ΄μ λ λ³μa
μ μ κ·Όνκ³ μ νλ©΄ μ€μ½ν 체μΈμμa
λ₯Ό κ²μνλ€κ° κ°μ₯ λ§μ§λ§μ λλ¬νλ μ μ μ€μ½νμLexicalEnvironment
μ¦, μ μ κ°μ²΄μμ ν΄λΉ νλ‘νΌν°a
λ₯Ό λ°κ²¬ν΄μ κ·Έ κ°μ λ°ννκΈ° λλ¬Έμ΄λ€.
// 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
- κ·Έλ°λ° μ μλ³μ μ μΈκ³Ό μ μκ°μ²΄μ νλ‘νΌν° ν λΉ μ¬μ΄μ μ ν λ€λ₯Έ κ²½μ°λ μλλ° λ°λ‘ μμ λͺ λ Ήμ λν΄ κ·Έλ λ€.
var a = 1;
delete window.a; // false
console.log(a, window.a, this.a); // 1 1 1
window.c = 3;
delete window.c; // true
console.log(c, window.c, this.c); // Uncaught ReferenceError: c is not defined
- μ μκ°μ²΄μ νλ‘νΌν°λ‘ ν λΉν κ²½μ°μλ μμ κ° λλ λ°λ©΄ μ μλ³μλ‘ μ μΈν κ²½μ°μλ μμ κ° λμ§ μλλ€. μ΄λ μ¬μ©μκ° μλμΉ μκ² μμ νλ κ²μ λ°©μ§νλ μ°¨μμμ λ§λ ¨ν λ°©μ΄ μ λ΅μ΄λ€.
π λ©μλλ‘μ νΈμΆν λ κ·Έ λ©μλ λ΄λΆμμμ thisβ
πΆ ν¨μ vs. λ©μλβ
- ν¨μμ λ©μλλ₯Ό ꡬλΆνλ μ μΌν μ°¨μ΄λ λ 립μ±μ μλ€. ν¨μλ κ·Έ μμ²΄λ‘ λ 립μ μΈ κΈ°λ₯μ μννλ λ°λ©΄, λ©μλλ μμ μ νΈμΆν λμ κ°μ²΄μ κ΄ν λμμ μννλ€.
// ν¨μλ‘μ νΈμΆ, λ©μλλ‘μ νΈμΆ
var func = function (x) {
console.log(this, x);
};
func(1); // Window {...} 1
var obj = {
method: func
};
obj.method(2); // { method: f } 2
- μλ μ΅λͺ
ν¨μλ κ·Έλλ‘μΈλ° μ΄λ₯Ό λ³μμ λ΄μ νΈμΆν κ²½μ°μ
obj
κ°μ²΄μ νλ‘νΌν°μ ν λΉν΄μ νΈμΆν κ²½μ°μthis
κ° λ¬λΌμ§λ€.
πΆ λ©μλ λ΄λΆμμμ thisβ
this
μλ νΈμΆν 주체μ λν μ λ³΄κ° λ΄κΈ΄λ€. μ΄λ€ ν¨μλ₯Ό λ©μλλ‘μ νΈμΆνλ κ²½μ° νΈμΆ 주체λ λ°λ‘ ν¨μ(νλ‘νΌν°λͺ ) μμ κ°μ²΄μ΄λ€. μ νκΈ°λ²μ κ²½μ° λ§μ§λ§ μ μμ λͺ μλ κ°μ²΄κ° 곧this
κ° λλ€.
var obj = {
methodA: function() { console.log(this); },
inner: {
methodB: function() { console.log(this); },
},
};
obj.methodA(); // { methodA: f, inner: {...} } ( === obj)
obj.inner.methodB(); // { methodB: f } ( === obj.inner)