μ£Όλμ΄ κ°λ°μμ κ°μΈ κ³΅λΆ κ³Όμ μ κΈ°λ‘ν©λλ€.
μλ°μ€ν¬λ¦½νΈμ κ°μ₯ νΌλμ€λ‘μ΄ κ°λ ? this?
λ€λ₯Έ λλΆλΆμ κ°μ²΄μ§ν₯ μΈμ΄μμ this
λ ν΄λμ€λ‘ μμ±ν μΈμ€ν΄μ€ κ°μ²΄λ₯Ό μλ―Ένλ€. ν΄λμ€μμλ§ μ¬μ©ν μ μκΈ° λλ¬Έμ νΌλμ μ¬μ§κ° λ§μ§λ μλ€.
νμ§λ§ μλ°μ€ν¬λ¦½νΈμμμ this
λ μ΄λμλ μ¬μ©ν μ μκ³ , this
κ° λ°λΌλ³΄λ λμμ΄ μν©μ λ°λΌ λ°λΌλ³΄λ λμμ΄ λ¬λΌμ§λ€
ν¨μμ κ°μ²΄(λ©μλ)μ ꡬλΆμ΄ λμ¨ν μλ°μ€ν¬λ¦½νΈμμ
this
λ μ€μ§μ μΌλ‘ μ΄ λμ ꡬλΆνλ κ±°μ μ μΌν κΈ°λ₯μ΄λ€.
μν©μ λ°λΌ λ¬λΌμ§λ this
μλ°μ€ν¬λ¦½νΈμμ this
λ κΈ°λ³Έμ μΌλ‘ μ€ν 컨ν
μ€νΈκ° μμ±λ λ ν¨κ» κ²°μ λλ€.
μ€ν 컨ν
μ€νΈλ ν¨μλ₯Ό νΈμΆν λ μμ±λλ―λ‘.this
λ ν¨μλ₯Ό νΈμΆν λ κ²°μ λλ€κ³ ν μ μλ€.
ν¨μλ₯Ό νΈμΆνλ λ°©μμ λ°λΌ κ°μ΄ λ¬λΌμ§λλ°
- μ μ 곡κ°μμμ
this
- λ©μλλ‘μ νΈμΆν λ κ·Έ λ©μλ λ΄λΆμμμ
this
- ν¨μλ‘μ νΈμΆν λ κ·Έ ν¨μ λ΄λΆμμμ
this
- μ½λ°± ν¨μ νΈμΆ μ κ·Έ ν¨μ λ΄λΆμμμ
this
- μμ±μ ν¨μ λ΄λΆμμμ
this
μ΄ μλ€
πΉ μ μ 곡κ°μμμ this
μ μ 곡κ°μμ
this
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. κ°λ μ μ μ 컨ν μ€νΈλ₯Ό μμ±νλ μ£Όμ²΄κ° λ°λ‘ μ μ κ°μ²΄μ΄κΈ° λλ¬Έμ΄λ€.
μ μ κ°μ²΄λ
- μλ°μ€ν¬λ¦½νΈ λ°νμ νκ²½μ λ°λΌ λ€λ₯Έ μ΄λ¦κ³Ό μ 보λ₯Ό κ°μ§κ³ μλ€
- λΈλΌμ°μ νκ²½μμ μ μ κ°μ²΄λ
window
μ΄κ³ Node.js
νκ²½μμλglobal
μ΄λ€
- λΈλΌμ°μ νκ²½μμ μ μ κ°μ²΄λ
- μ μ 곡κ°μμμ
this
λ μ μ κ°μ²΄λ₯Ό μλ―Ένλ©°λ©°, μλ°μ€ν¬λ¦½νΈμ λͺ¨λ λ³μλ νΉμ κ°μ²΄μ νλ‘νΌν°λ‘ ν λΉλλ€. κ·Έλ¦¬κ³ κ·Έ νΉμ κ°μ²΄λ μ€ν 컨ν μ€νΈμLexicalEnvirment(L.E)
μ΄λ€.
let a = 1;
console.log(a) // 1
console.log(window.a) // 1
console.log(this.a) // 1
window.a = 3
console.log(a) // 3
console.log(this.a) // 3
console.log(this.a) // 3
window.b = 5
delete a // false
delete window.a // false
delete window.b // true
λ³μμ delete
μ°μ°μλ₯Ό μ°λ κ²μ΄ μ΄μν΄λ³΄μΌ μλ μμ§λ§, window.
λ₯Ό μλ΅ν κ²κ³Ό κ°λ€. μ μ λ³μκ° κ³§ μ μ κ°μ²΄μ νλ‘νΌν°μ΄λ―λ‘ λ¬Έμ λμ§ μλλ€.
μ μ λ³μλ₯Ό μ μΈνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μλμΌλ‘ μ μ κ°μ²΄μ νλ‘νΌν°λ‘ ν λΉνλ©΄μ μΆκ°μ μΌλ‘ ν΄λΉ νλ‘νΌν°μ configurable μμ±(λ³κ²½ λ° μμ κ°λ₯μ±)μ false
λ‘ μ μνλ€.
μ μ λ³μμ μ μ κ°μ²΄μ νλ‘νΌν°λ νΈμ΄μ€ν μ¬λΆ λ° configurable μ¬λΆμμ μ°¨μ΄κ° μλ€
πΉ λ©μλλ‘μ νΈμΆν λ κ·Έ λ©μλ λ΄λΆμμμ this
βοΈν¨μ vs. λ©μλ
μ΄λ€ ν¨μλ₯Ό μ€ννλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μλλ°, μΌλ°μ μΌλ‘
- ν¨μλ‘μ νΈμΆνλ κ²½μ°
- λ©μλλ‘μ νΈμΆνλ κ²½μ°κ° μλ€
νλ‘κ·Έλλ° μΈμ΄μμ ν¨μμ λ©μλλ 미리 μ μν λμμ μννλ μ½λ λμΉλ‘, μ΄ λμ ꡬλΆνλ μ μΌν μ°¨μ΄λ λ 립μ±μ μλ€
- ν¨μ: κ·Έ μμ²΄λ‘ λ 립μ μΈ κΈ°λ₯μ μν
- λ©μλ: μμ μ νΈμΆν λμ κ°μ²΄μ κ΄ν λμμ μν
const func = function (x) {
console.log(this, x)
}
// ν¨μλ‘μ νΈμΆ
func(1) // Window { ... } 1
const obj = {
method : func
}
// λ©μλλ‘μ νΈμΆ
obj.method(2); // { method: f } 2
obj['method'](2) // { method: f } 2
βοΈ λ©μλ λ΄λΆμμμ this
this
μλ νΈμΆν 주체μ λν μ λ³΄κ° λ΄κΈ΄λ€
μ΄λ€ ν¨μλ₯Ό λ©μλλ‘μ νΈμΆνλ κ²½μ° νΈμΆ 주체λ ν¨μλͺ
(νλ‘νΌν°λͺ
) μμ κ°μ²΄μ΄λ€
const 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)
obj.inner['methodB'](); // { methodB: f } (=== obj.inner)
obj['inner']['methodB'](); // { methodB: f } (=== obj.inner)
πΉ ν¨μλ‘μ νΈμΆν λ κ·Έ ν¨μ λ΄λΆμμμ this
βοΈ ν¨μ λ΄λΆμμμ this
-
μ΄λ€ ν¨μλ₯Ό ν¨μλ‘μ νΈμΆν κ²½μ°μλ
this
κ° μ§μ λμ§ μλλ€ -
this
μλ νΈμΆν 주체μ μ 보λ₯Ό λ΄κ³ μλλ°, ν¨μλ‘μ νΈμΆνλ κ²μ νΈμΆ 주체λ₯Ό λͺ μνμ§ μκ³ κ°λ°μκ° μ½λλ₯Ό μ§μ μ€νν κ²μ΄κΈ° λλ¬Έμ νΈμΆ 주체λ₯Ό μ μ μλ€
μ€ν 컨ν μ€νΈ νμ±νν λΉμμ
this
κ° μ§μ λμ§ μμ κ²½μ°this
λ μ μ κ°μ²΄λ₯Ό λ°λΌλ³Έλ€. λ°λΌμ ν¨μμμμthis
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
βοΈ λ©μλμ λ΄λΆν¨μμμμ this
const obj1 = {
outer : function () {
console.log(this); // (1)
const innerFunc = function () {
console.log(this); // (2) (3)
}
innerFunc(); // (2) νΈμΆ
const obj2 = {
innerMethod : innerFunc
}
obj2.innerMethod() // (3) νΈμΆ
}
}
obj1.outer(); // (1) νΈμΆ
(1)νΈμΆ: νΈμΆν λ μ (.)μ΄ μλ€ β λ©μλλ‘μ νΈμΆ β obj1μ λ°μΈλ© ν¨
(2)νΈμΆ: νΈμΆν λ μ (.)μ΄ μλ€ β ν¨μλ‘μ νΈμΆ β μ μκ°μ²΄(window)μ λ°μΈλ© ν¨
(3)νΈμΆ: νΈμΆν λ μ (.)μ΄ μλ€ β λ©μλλ‘μ νΈμΆ β obj2μ λ°μΈλ© ν¨
βοΈ λ©μλμ λ΄λΆν¨μμμμ this
λ₯Ό μ°ννλ λ°©λ²(ES6+)
self
ν¨μλ₯Ό μ¬μ©
const obj1 = {
outer : function () {
console.log(this);
const innerFunc1 = function () {
console.log(this);
}
innerFunc1(); // μ μκ°μ²΄(window) νΈμΆ
const self = this;
const innerFunc2 = function () {
console.log(self);
}
innerFunc2(); // obj1.outer νΈμΆ
}
}
βοΈ this
λ₯Ό λ°μΈλ©νμ§ μλ ν¨μ, νμ΄ν ν¨μ(ES6+)
νμ΄ν νμλ μ€ν 컨ν
μ€νΈλ₯Ό μμ±ν λ this
λ°μΈλ© κ³Όμ μμ²΄κ° λΉ μ§κ² λμ΄, μμ μ€μ½νμ this
λ₯Ό κ·Έλλ‘ νμ©ν μ μλ€.
πΉ μ½λ°± ν¨μ νΈμΆ μ κ·Έ ν¨μ λ΄λΆμμμ this
μ½λ°± ν¨μλ? ν¨μ Aμ μ μ΄κΆμ λ€λ₯Έ ν¨μ(λλ λ©μλ) Bμκ² λ겨주λ κ²½μ° ν¨μ Aλ₯Ό μ½λ°± ν¨μλΌ νλ€.
- ν¨μ Aλ ν¨μ Bμ λ΄λΆ λ‘μ§μ λ°λΌ μ€ν
this
μμ ν¨μ B λ΄λΆ λ‘μ§μμ μ ν κ·μΉμ λ°λΌ κ°μ΄ κ²°μ λλ€.
πΉ μμ±μ ν¨μ λ΄λΆμμμ this
μμ±μ ν¨μλ? μ΄λ€ 곡ν΅λ μ±μ§μ μ§λλ κ°μ²΄λ€μ μμ±νλλ° μ¬μ©νλ ν¨μ. ꡬ체μ μΈ μΈμ€ν΄μ€λ₯Ό λ§λ€κΈ° μν ν
- κ°μ²΄μ§ν₯ μΈμ΄μμ μμ±μλ₯Ό ν΄λμ€
class
, - ν΄λμ€
class
λ₯Ό ν΅ν΄ λ§λ κ°μ²΄λ₯Ό μΈμ€ν΄μ€instance
- μμ)
- ν΄λμ€
class
: λΆμ΄λΉ΅ ν - μΈμ€ν΄μ€
instance
: ν₯λΆμ΄λΉ΅, ν¬λ¦ΌλΆμ΄λΉ΅
- ν΄λμ€
μμ±μλ? ꡬ체μ μΈ μΈμ€ν΄μ€λ₯Ό λ§λ€κΈ° μν ν
μλ°μ€ν¬λ¦½νΈλ ν¨μμ μμ±μλ‘μμ μν μ ν¨κ» λΆμ¬νλλ°,
new
ν€μλμ ν¨κ» ν¨μλ₯Ό νΈμΆνλ©΄ ν΄λΉ ν¨μκ° μμ±μλ‘μ λμνκ² λκ³
μ΄λ€ ν¨μκ° μμ±μ ν¨μλ‘μ νΈμΆλ κ²½μ° λ΄λΆμμμ this
λ 곧 μλ‘ λ§λ€ ꡬ체μ μΈ μΈμ€ν΄μ€instance
μμ μ΄ λλ€
λͺ
μμ μΌλ‘ this
λ₯Ό λ°μΈλ©νλ λ°©λ²
μν©λ³λ‘ this
μ μ΄λ€ κ°μ΄ λ°μΈλ©λλμ§λ₯Ό μ΄ν΄λ΄€λ€.
μ΄μ λ μ΄λ¬ν κ·μΉμ κΉ¨κ³ this
μ λ³λμ λμμ λ°μΈλ©νλ λ°©λ²μ μμ보μ.
πΈ call
λ©μλ
call
λ©μλλ λ©μλμ νΈμΆ μ£Όμ²΄μΈ ν¨μλ₯Ό μ¦μ μ€ννλλ‘ νλ λͺ λ Ή
call
λ©μλμ 첫 λ²μ§Έ μΈμλ₯Όthis
λ‘ λ°μΈλ©νκ³- λ λ²μ§Έ μΈμλ‘ μμμ κ°μ²΄λ₯Ό
this
λ‘ μ§μ ν μ μλ€
const 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
πΈ apply
λ©μλ
apply
λ©μλλcall
λ©μλμ κΈ°λ₯μ μΌλ‘ μμ ν λμΌνλ€. λ€λ§,call
λ©μλμ λ¬λ¦¬ λ λ²μ§Έ μΈμλ₯Ό λ°°μ΄λ‘ λ°μ κ·Έ λ°°μ΄μ μμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ μ§μ νλ€λ μ°¨μ΄μ μ΄ μλ€.
const func = function (a, b, c) {
console.log(this, a, b, c);
}
func.apply({x: 1}, [4, 5, 6]); // {x: 1} 4 5 6
π©μ°Έκ³
call
/apply
λ©μλλ μ μ¬λ°°μ΄κ°μ²΄μ λͺ¨λ λ°°μ΄ λ°°μλλ₯Ό μ μ©ν μ μλλ€. λ¨, μλ³Έ λ¬Έμμ΄μ λ³κ²½μ κ°νλ λ©μλ(push
,pop
,shift
,unshift
,splice
)λ μλ¬ λ°μ.
π©μ°Έκ³ ES6μμλ μ μ¬λ°°μ΄κ°μ²΄ λλ μν κ°λ₯ν λͺ¨λ μ’ λ₯μ λ°μ΄ν° νμ μ λ°°μ΄λ‘ μ ννλ
Array.from
λ©μλλ₯Ό μλ‘ λμconst obj = { 0: 'a', 1: 'b', 2: 'c' length : } Array.from(obj) // ['a' , 'b', 'c']
πΈ bind
λ©μλ
bind
λ©μλλ ES5+μμ μΆκ°λ κΈ°λ₯μΌλ‘,call
λ©μλμ λΉμ·νμ§λ§, μ¦μ νΈμΆνμ§λ μκ³ λ겨λ°μthis
λ° μΈμλ€μ λ°νμΌλ‘ μλ‘μ΄ ν¨μλ₯Ό λ°ννκΈ°λ§ νλ λ©μλ
const func = function (a, b, c) {
console.log(this, a, b, c);
}
func(1, 2, 3); // Window{...} 1 2 3
const bindFunc1 = func.bind({x: 1});
bindFunc1(1, 2, 3); // {x: 1} 1 2 3
const bindFunc2 = func.bind({x: 1}, 4, 5);
bindFunc2(6); // {x: 1} 4 5 6
bindFunc2(7); // {x: 1} 4 5 7
πΈ νμ΄ν ν¨μμ μμΈμ¬ν
ES6
μμ μλ‘κ² λμ
λ νμ΄ν ν¨μλ μ€ν 컨ν
μ€νΈ μμ± μ this
λ₯Ό λ°μΈλ©νλ κ³Όμ μ΄ μ μΈλμλ€. μ¦, μ΄ ν¨μ λ΄λΆμλ this
κ° μμ μμΌλ©°, μ κ·Όνκ³ μ νλ©΄ μ€μ½ν체μΈμ κ°μ₯ κ°κΉμ΄ this
μ μ κ·Όνκ² λλ€.
πΈ λ³λμ μΈμλ‘ this
λ₯Ό λ°λ κ²½μ°(μ½λ°± ν¨μ λ΄μμμ this
)
μμλ₯Ό μννλ©΄μ μ½λ°± ν¨μλ₯Ό λ°λ³΅ νΈμΆνλ λ΄μ©μ μΌλΆ λ©μλλ λ³λμ μΈμλ‘ this
λ₯Ό λ°κΈ°λ νλ€
β¨ tl;dr
π΅ λͺ
μμ this
λ°μΈλ©μ΄ μλ ν,
- μ μ 곡κ°μμμ
this
λ μ μκ°μ²΄λ₯Ό μ°Έμ‘° (.)μ΄ μλ κ²½μ°
(= μ΄λ€ ν¨μλ₯Ό λ©μλλ‘μ νΈμΆν κ²½μ°)this
λ λ©μλ νΈμΆ 주체(λ©μλλͺ μμ κ°μ²΄)λ₯Ό μ°Έμ‘°(.)μ΄ μλ κ²½μ°
(= μ΄λ€ ν¨μλ₯Ό ν¨μλ‘μ νΈμΆν κ²½μ°)this
λ μ μ κ°μ²΄λ₯Ό μ°Έμ‘°. λ©μλμ λ΄λΆν¨μμμλ λμΌ- μ½λ°± ν¨μ λ΄λΆμμμ
this
λ ν΄λΉ μ½λ°± ν¨μμ μ μ΄κΆμ λ겨λ°μ ν¨μκ° μ μν λ°λ₯Ό μ°Έμ‘°, μ μνμ§ μμ κ²½μ°μλ μ μκ°μ²΄λ₯Ό μ°Έμ‘° new
μμ±μ ν¨μμμμthis
λ μμ±λ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°
π΅ λͺ
μμ this
λ°μΈλ©μ κ²½μ°
call
,apply
λ©μλλthis
λ₯Ό λͺ μμ μΌλ‘ μ§μ νλ©΄μ ν¨μ λλ λ©μλλ₯Ό νΈμΆbind
λ©μλλthis
λ° ν¨μμ λκΈΈ μΈμλ₯Ό μΌλΆ μ§μ ν΄μ μλ‘μ΄ ν¨μλ₯Ό λ°ν- μμλ₯Ό μννλ©΄μ μ½λ°± ν¨μλ₯Ό λ°λ³΅ νΈμΆνλ λ΄μ©μ μΌλΆ λ©μλ(
set
,map
,forEach
) λ λ³λμ μΈμλ‘this
λ₯Ό λ°κΈ°λ νλ€.
μΌλ‘ this
λ₯Ό μμΈ‘ν μ μλ€