π 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)
π ν¨μλ‘μ νΈμΆν λ κ·Έ ν¨μ λ΄λΆμμμ thisβ
πΆ ν¨μ λ΄λΆμμμ thisβ
- μ΄λ€ ν¨μλ₯Ό ν¨μλ‘μ νΈμΆν κ²½μ°μλ
this
κ° μ§μ λμ§ μλλ€. ν¨μλ‘μ νΈμΆνλ κ²μ νΈμΆ 주체λ₯Ό λͺ μνμ§ μκ³ κ°λ°μκ° μ½λμ μ§μ κ΄μ¬ν΄μ μ€νν κ²μ΄κΈ° λλ¬Έμ νΈμΆ 주체μ μ 보λ₯Ό μ μ μλ€. - κ·Έλ κΈ° λλ¬Έμ
this
κ° μ§μ λμ§ μμκΈ°μthis
λ μ μ κ°μ²΄λ₯Ό κ°ν€λ¦°λ€. - μ΄κ²μ μ€κ³μμ μ€λ₯μ΄λ€.
πΆ λ©μλμ λ΄λΆν¨μμμμ thisβ
var obj1 = {
outer: function () {
console.log(this); // (1)
var innerFunc = function () {
console.log(this); // (2) (3)
}
innerFunc();
var obj2 = {
innerMethod: innerFunc
};
obj2.innerMethod();
}
};
obj1.outer();
- (1)μ
obj1
, (2)λ μ μκ°μ²΄(Window
) (3)μobj2
μ΄λ€.obj1.outer
λ₯Ό νΈμΆνλ€.obj1.outer
ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λλ©΄μ νΈμ΄μ€ν νκ³ , μ€μ½ν μ²΄μΈ μ 보λ₯Ό μμ§νκ³ ,this
λ₯Ό λ°μΈλ©νλ€. μ΄ ν¨μλ νΈμΆν λ ν¨μλͺ μΈouter
μμ μ μ΄ μμμΌλ―λ‘ λ©μλλ‘μ νΈμΆν κ²μ΄λ€. λ°λΌμthis
μλ λ§μ§λ§ μ μμ κ°μ²΄μΈobj1
μ΄ λ°μΈλ©λλ€.obj1
μ κ°μ²΄ μ λ³΄κ° μΆλ ₯λλ€.- νΈμ΄μ€ν
λ λ³μ
innerFunc
λouter
μ€μ½ν λ΄μμλ§ μ κ·Όν μ μλ μ§μλ³μμ΄λ€. μ΄ μ§μλ³μμ μ΅λͺ ν¨μλ₯Ό ν λΉνλ€. innerFunc
λ₯Ό νΈμΆνλ€.innerFunc
ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λλ©΄μ νΈμ΄μ€ν νκ³ , μ€μ½ν μ²΄μΈ μ 보λ₯Ό μμ§νκ³ ,this
λ₯Ό λ°μΈλ©νλ€. μ΄ ν¨μλ₯Ό νΈμΆν λ ν¨μλͺ μμλ μ μ΄ μλ€. μ¦ ν¨μλ‘μ νΈμΆν κ²μ΄λ―λ‘this
κ° μ§μ λμ§ μμκ³ , λ°λΌμ μλμΌλ‘ μ€μ½ν 체μΈμμ μ΅μμ κ°μ²΄μΈ μ μκ°μ²΄(Window
)κ° λ°μΈλ©λλ€.Window
κ°μ²΄ μ λ³΄κ° μΆλ ₯λλ€.- νΈμ΄μ€ν
λ λ³μ
obj2
μμouter
μ€μ½ν λ΄μμλ§ μ κ·Όν μ μλ μ§μλ³μμ΄λ€. μ¬κΈ°μ λ€μ κ°μ²΄λ₯Ό ν λΉνλλ°, κ·Έ κ°μ²΄μλinnerMethod
λΌλ νλ‘νΌν°κ° μμΌλ©° μ¬κΈ°μλ μμ μ μλ λ³μinnerFunc
μ μ°κ²°λ μ΅λͺ ν¨μκ° μ°κ²°λλ€. obj2.innerMethod
λ₯Ό νΈμΆνλ€.obj2.innerMethod
ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ΄ ν¨μλ νΈμΆν λ ν¨μλͺ μΈinnerMethod
μμ μ μ΄ μμμΌλ―λ‘ λ©μλλ‘μ νΈμΆν κ²μ΄λ€. λ°λΌμthis
μλ λ§μ§λ§ μ μμ κ°μ²΄μΈobj2
κ° λ°μΈλ©λλ€.obj2
κ°μ²΄ μ λ³΄κ° μΆλ ₯λλ€.
- μμ μμ μ κ°μ΄
this
λ°μΈλ©μ κ΄ν΄μλ ν¨μλ₯Ό μ€ννλ λΉμ μ£Όλ³ νκ²½μ μ€μνμ§ μκ³ , μ€μ§ ν΄λΉ ν¨μλ₯Ό νΈμΆνλ ꡬ문 μμ μ λλ λκ΄νΈ νκΈ°κ° μλμ§ μλμ§κ° κ΄κ±΄μ΄λ€.
πΆ λ©μλμ λ΄λΆ ν¨μμμμ thisλ₯Ό μ°ννλ λ°©λ²β
- νΈμΆ μ£Όμ²΄κ° μμ λλ μλμΌλ‘ μ μκ°μ²΄λ₯Ό λ°μΈλ©νμ§ μκ³ νΈμΆ λΉμ μ£Όλ³ νκ²½μ
this
λ₯Ό κ·Έλλ‘ μμλ°μ μ¬μ©ν μ μμΌλ©΄ μ’μκ²μ΄λ€. νμ§λ§ ES5κΉμ§λ μ체μ μΌλ‘ λ΄λΆν¨μμthis
λ₯Ό μμν λ°©λ²μ΄ μμ§λ§ μ°νν λ°©λ²μ΄ μλ€. λμ€μ μΈ λ°©λ²μΌλ‘ λ³μλ₯Ό νμ©ν λ°©λ²μ΄λ€.
var obj1 = {
outer: function () {
console.log(this); // (1) { outer: f }
var innerFunc1 = function () {
console.log(this); // (2) Window {...}
}
innerFunc1();
var self = this;
var innerFunc2 = function () {
console.log(self); // (3) { outer: f }
};
innerFunc2();
}
};
obj1.outer();
self
λ κ·Έμ μμ μ€μ½νμthis
λ₯Ό μ μ₯ν΄μ λ΄λΆν¨μμμ νμνλ €λ μλ¨μ΄λ€.
πΆ thisλ₯Ό λ°μΈλ©νμ§ μλ ν¨μβ
- ES6μμλ ν¨μ λ΄λΆμμ
this
κ° μ μκ°μ²΄λ₯Ό λ°λΌλ³΄λ λ¬Έμ λ₯Ό 보μνκ³ μ,this
λ₯Ό λ°μΈλ©νμ§ μλ νμ΄ν ν¨μλ₯Ό λμ νλ€. νμ΄ν ν¨μλ μ€ν 컨ν μ€νΈλ₯Ό μμ±ν λthis
λ°μΈλ© κ³Όμ μμ²΄κ° λΉ μ§κ² λμ΄, μμ μ€μ½νμthis
λ₯Ό κ·Έλλ‘ νμ©ν μ μλ€.
var obj = {
outer: function () {
console.log(this); // (1) { outer: f }
var innerFunc = () => {
console.log(this); // (2) { outer: f }
};
innerFunc();
},
};
obj.outer();
- κ·Έ λ°μλ
call
,apply
λ±μ λ©μλλ₯Ό νμ©ν΄ ν¨μλ₯Ό νΈμΆν λ λͺ μμ μΌλ‘this
λ₯Ό μ§μ νλ λ°©λ²μ΄ μλ€.
π μ½λ°± ν¨μ νΈμΆ μ κ·Έ ν¨μ λ΄λΆμμμ thisβ
- ν¨μ Aμ μ μ΄κΆμ λ€λ₯Έ ν¨μ Bμκ² λ겨주λ κ²½μ° ν¨μ Aλ₯Ό μ½λ°± ν¨μλΌ νλ€. μ΄λ ν¨μ Aλ ν¨μ Bμ λ΄λΆ λ‘μ§μ λ°λΌ μ€νλλ©°,
this
μμ ν¨μ B λ΄λΆ λ‘μ§μμ μ ν κ·μΉμ λ°λΌ κ°μ΄ κ²°μ λλ€. - μ½λ°± ν¨μλ ν¨μμ΄κΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘
this
κ° μ μκ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§, μ μ΄κΆμ λ°μ ν¨μμμ μ½λ°± ν¨μμ λ³λλ‘this
κ° λ λμμ μ§μ ν κ²½μ°μλ κ·Έ λμμ μ°Έμ‘°νκ² λλ€.
setTimeout(function () { console.log(this); }, 300); // (1)
[1, 2, 3, 4, 5].forEach(function (x) { // (2)
console.log(this, x);
});
document.body.innerHTML += '<button id="a">ν΄λ¦</button>';
document.body.querySelector('#a')
.addEventListener('click', function (e) { // (3)
console.log(this, e);
});
- 1λ²μ 300msλ§νΌ μκ° μ§μ°μ ν λ€ μ½λ°± ν¨μλ₯Ό μ€ννλΌλ λͺ λ Ήμ΄λ€. 0.3μ΄ λ€ μ μκ°μ²΄κ° μΆλ ₯λλ€.
- 2λ²μ μ μκ°μ²΄μ λ°°μ΄μ κ° μμκ° μ΄ 5ν μΆλ ₯λλ€.
- 3λ²μ λ²ν°μ ν΄λ¦νλ©΄ μμ μ§μ ν μ리먼νΈμ ν΄λ¦ μ΄λ²€νΈμ κ΄ν μ λ³΄κ° λ΄κΈ΄ κ°μ²΄κ° μΆλ ₯λλ€.
- 1λ²κ³Ό 2λ²μ κ·Έ λ°°λμμ μ½λ°± ν¨μλ₯Ό νΈμΆν λ λμμ΄ λ
this
λ₯Ό μ§μ νμ§ μλλ€. λ°λΌμ μ½λ°± ν¨μ λ΄λΆμμμthis
λ μ μκ°μ²΄λ₯Ό μ°Έμ‘°νλ€. - 3λ²μ μ½λ°± ν¨μλ₯Ό νΈμΆν λ μμ μ
this
λ₯Ό μμνλλ‘ μ μλΌ μλ€. κ·Έλ¬λκΉ λ©μλλͺ μ μ μλΆλΆμ΄ 곧this
κ° λλ κ²μ΄λ€. - κ·Έλ κΈ° λλ¬Έμ μ½λ°± ν¨μμ μ μ΄κΆμ κ°μ§λ ν¨μ(λ©μλ)κ° μ½λ°± ν¨μμμμ
this
λ₯Ό 무μμΌλ‘ ν μ§λ₯Ό κ²°μ νλ©°, νΉλ³ν μ μνμ§ μμ κ²½μ°μλ κΈ°λ³Έμ μΌλ‘ ν¨μμ λ§μ°¬κ°μ§λ‘ μ μκ°μ²΄λ₯Ό λ°λΌλ³Έλ€.
π μμ±μ ν¨μ λ΄λΆμμμ thisβ
- μμ±μ ν¨μλ μ΄λ€ 곡ν΅λ μ±μ§μ μ§λλ κ°μ²΄λ€μ μμ±νλ λ° μ¬μ©νλ ν¨μμ΄λ€.
- μμ±μλ ꡬ체μ μΈ μΈμ€ν΄ μ€λ₯Ό λ§λ€κΈ° μν μΌμ’ μ νμ΄λ€.
- μ΄λ€ ν¨μκ° μμ±μ ν¨μλ‘μ νΈμΆλ κ²½μ° λ΄λΆμμμ
this
λ 곧 μλ‘ λ§λ€ ꡬ체μ μΈ μΈμ€ν΄μ€ μμ μ΄ λλ€. - μμ±μ ν¨μλ₯Ό νΈμΆ(
new
λͺ λ Ήμ΄μ ν¨κ» ν¨μλ₯Ό νΈμΆ)νλ©΄ μ°μ μμ±μμprototype
νλ‘νΌν°λ₯Ό μ°Έμ‘°νλ__proto__
λΌλ νλ‘νΌν°κ° μλ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό λ§λ€κ³ , 미리 μ€λΉλ κ³΅ν΅ μμ± λ° κ°μ±μ ν΄λΉ κ°μ²΄(this
)μ λΆμ¬νλ€. μ΄λ κ² ν΄μ ꡬ체μ μΈ μΈμ€ν΄μ€κ° λ§λ€μ΄μ§λ€.
var Cat = function (name, age) {
this.bark = 'μΌμΉ';
this.name = name;
this.age = age;
};
var choco = new Cat('μ΄μ½', 7);
var nabi = new Cat('λλΉ', 5);
console.log(choco, nabi);
// CatΒ {bark: "μΌμΉ", name: "μ΄μ½", age: 7}
// CatΒ {bark: "μΌμΉ", name: "λλΉ", age: 5}
π λͺ μμ μΌλ‘ thisλ₯Ό λ°μΈλ©νλ λ°©λ²β
π call λ©μλβ
Function.prototype.call(thisArg[, arg1[, arg2[, ...]]])
call
λ©μλλ λ©μλμ νΈμΆ μ£Όμ²΄μΈ ν¨μλ₯Ό μ¦μ μ€ννλλ‘ νλ λͺ λ Ήμ΄λ€.- μ΄λ
call
λ©μλμ 첫 λ²μ§Έ μΈμλ₯Όthis
λ‘ λ°μΈλ©νκ³ , μ΄νμ μΈμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ νλ€. ν¨μλ₯Ό κ·Έλ₯ μ€ννλ©΄this
λ μ μκ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§call
λ©μλλ₯Ό μ΄μ©νλ©΄ μμμ κ°μ²΄λ₯Όthis
λ‘ μ§μ ν μ μλ€.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
func(1, 2, 3); // Window{ ... } 1 2 3
func.call({ x: 1 }, 4, 5, 6); // { x: 1 } 4 5 6
- λ©μλμ λν΄μλ λ§μ°¬κ°μ§λ‘ κ°μ²΄μ λ©μλλ₯Ό κ·Έλ₯ νΈμΆνλ©΄
this
λ κ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§call
λ©μλλ₯Ό μ΄μ©νλ©΄ μμμ κ°μ²΄λ₯Όthis
λ‘ μ§μ ν μ μλ€.
var obj = {
a: 1,
method: function(x, y) {
console.log(this.a, x, y);
}
};
obj.method(2, 3); // 1 2 3
obj.method.call({ a: 4 }, 5, 6); // 4 5 6
π apply λ©μλβ
Function.prototype.apply(thisArg[, argsArray])
apply
λ©μλλcall
λ©μλμ κΈ°λ₯μ μΌλ‘ μμ ν λμΌνλ€.call
λ©μλλ 첫 λ²μ§Έ μΈμλ₯Ό μ μΈν λλ¨Έμ§ λͺ¨λ μΈμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ μ§μ νλ λ°λ©΄,apply
λ©μλλ λ λ²μ§Έ μΈμλ₯Ό λ°°μ΄λ‘ λ°μ κ·Έ λ°°μ΄μ μμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ μ§μ νλ€λ μ μμλ§ μ°¨μ΄κ° μλ€.
var func = function(a, b, c) {
console.log(this, a, b, c);
};
func.apply({ x: 1 }, [4, 5, 6]); // { x: 1 } 4 5 6
var obj = {
a: 1,
method: function(x, y) {
console.log(this.a, x, y);
},
};
obj.method.apply({ a: 4 }, [5, 6]); // 4 5 6