[JavaScript] this
μΉ΄ν
κ³ λ¦¬ : νλ‘κ·Έλλ° μΈμ΄
νκ·Έ: javascript · μλ°μ€ν¬λ¦½νΈ · this · μ μ 곡κ°μμμ this · λ©μλ νΈμΆμ this · ν¨μ νΈμΆμ this · μ νκΈ°λ² · λκ΄νΈ νκΈ°λ² · μ½λ°± ν¨μ νΈμΆμμμ this · μμ±μ ν¨μ λ΄λΆμμμ this · λͺ μμ this λ°μΈλ© · call · apply · bind
νκ·Έ: javascript · μλ°μ€ν¬λ¦½νΈ · this · μ μ 곡κ°μμμ this · λ©μλ νΈμΆμ this · ν¨μ νΈμΆμ this · μ νκΈ°λ² · λκ΄νΈ νκΈ°λ² · μ½λ°± ν¨μ νΈμΆμμμ this · μμ±μ ν¨μ λ΄λΆμμμ this · λͺ μμ this λ°μΈλ© · call · apply · bind
- 1. this
- 2. λͺ μμ this λ°μΈλ©
1. this
this
λ μ€ν 컨ν μ€νΈκ° μμ± λ λ ν¨κ» κ²°μ λ.- λ°λΌμ
this
λ ν¨μλ₯Ό νΈμΆν λ κ²°μ λλκ²μ΄λ€.
(1) μ μ 곡κ°μμμ this
- μ μ 곡κ°μμ
this
λ μ μ κ°μ²΄λ₯Ό κ°λ₯΄ν¨λ€. - λ°λΌμ λΈλΌμ°μ νκ²½μ
this
λwindow
λ₯Ό κ°λ₯΄ν΄ - λ°λΌμ Node.js νκ²½μ
this
λglobal
μ κ°λ₯΄ν΄
var a = 1;
console.log(a); // 1
console.log(window); // 1
console.log(this.a); // 1
- μ΄ μ½λμμλ μ μ 곡κ°μμ μ μΈν λ³μμ 1μ ν λΉνλλ°
window
,this
κ° λͺ¨λ1
μ΄ μΆλ ₯λ βthis
λ μ μκ°μ²΄μ΄λ―λ‘window
κ°μ²΄κ° λμμΌνλ€ κ·Όλ°1
μ΄ μΆλ ₯λ - μ¬κΈ°μ μ€μν κ²μ μ μλ³μλ₯Ό μ μΈνλ©΄ JavaScript μμ§μ μ μ κ°μ²΄μ νλ‘νΌν°λ‘ ν λΉλλ€
- μ΄μ λ λ³μ
a
μ μ μκ°μ²΄μμ μ μ μ€μ½ν L.E , μ μΈν νλ‘νΌν°a
λ₯Ό λ°κ²¬ν΄μ κ·Έ κ°μ λ°ννκΈ° λλ¬Έμ 1μ΄ μΆλ ₯λκ²μ΄λ€
λ°λΌμ window νλ‘νΌν°μ ν λΉν΄λ varλ‘ μ μΈν κ²°κ³Όκ° λκ°λ€
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
(2) λ©μλλ‘μ νΈμΆν λ λ©μλ λ΄λΆμμμ this
- ν¨μ νΈμΆ: λ 립 μ μΈ κΈ°λ₯ μν
- λ©μλ νΈμΆ: μμ μ νΈμΆν λμ κ°μ²΄μ κ΄ν λμ μν
var func = function (x) {
console.log(this, x);
};
// (1) ν¨μ νΈμΆ
func(1);
//WindowΒ {0: Window, window: Window, self: Window, document: document, name: '', location: Location,Β β¦}
var obj = {
method: func,
};
// (2) λ©μλ νΈμΆ (μ νκΈ°λ²)
obj.method(2);
// {method: Ζ}method: Ζ (x)[[Prototype]]: Object 2
// (3) λ©μλ νΈμΆ (λκ΄νΈ νκΈ°λ²)
var obj2 = {
method: function (x) {
console.log(this, x);
},
};
obj2["method"](2);
- μ½κ² κ΅¬λΆ νλ λ°©λ²μ ν¨μ μμ μ (.)μ΄ μλ μλ λκ΄νΈκ° μλ μλμ νλ¨μΌλ‘ μ½κ² κ΅¬λΆ κ°λ₯νλ€
λ°λΌμ μ νκΈ°λ²μμ λ§μ§λ§ μ μμ λͺ
μλ κ°μ²΄κ° this
λΌλ κ²μ΄λ€
(3) ν¨μ νΈμΆλ‘μ νΈμΆν λ ν¨μ λ΄λΆμ this
var obj1 = {
outer: function () {
console.log(this); // (1) obj1
var innerFunc = function () {
console.log(this); // (2) window // (3) obj2
};
innerFunc();
var obj2 = {
innerMethod: innerFunc,
};
obj2.innerMethod();
},
};
obj1.outer();
this
λ₯Ό μ΄ν΄ νκΈ° μν μ½λ μ€ν κ³Όμ
- κ°μ²΄λ₯Ό μμ±νκ³
outer()
νλ‘νΌν°λ₯Ό obj1μ ν λΉ obj.outer()
νΈμΆobj.outer()
μ μ€ν 컨ν μ€νΈ μμ± λ°innerFunc
μobj2
λ₯Ό Hoistingconsole.log(this)
μμ ν΄λΉthis
λ₯Ό λ°μΈλ©νλ€- μ νκΈ°λ²μΌλ‘ λ©μλλ₯Ό νΈμΆνμΌλ (1)μ μ μμ κ°μ²΄
obj1
λ₯Ό λ°μΈλ© innerFunc
μ μ΅λͺ ν¨μλ₯Ό ν λΉνκ³ νΈμΆinnerFunc
μ μ€ν 컨ν μ€νΈ μμ± λ° Hoistngconsole.log(this)
μμ ν΄λΉthis
λ₯Ό λ°μΈλ©νλ€- μ΄
this
νΈμΆμ μ νκΈ°λ²μΌλ‘ νΈμΆλμ§ μμμΌλ μ μκ°μ²΄window
κ° λ°μΈλ©λλ€ obj2
λinnerMethod
νλ‘νΌν°μinnerFunc
λ₯Ό ν λΉνκ³ λ€μ νΈμΆ- μ¬κΈ°μ λ νΈμΆ μ
innerMethod
μμobj2
μ μ νκΈ°λ‘ νΈμΆ νμΌλobj2
κ° λ°μΈλ©λλ€
μ£Όλ³ νκ²½μ μ€μνμ§ μκ³ ν΄λΉ ν¨μ νΈμΆ λΆλΆμ λ°λΌμ thisλ μ νκΈ° μΈμ§ λκ΄νΈ νκΈ°λ₯Ό νμΈν΄μΌ thisκ° μ΄λ€ κ±Έ λ°μΈλ©νλμ§ μ μ μλ€
(1) λ©μλ λ΄λΆμμ this μ°ν λ°©λ²
this
μ λ³μλ₯Ό νμ©νλ λ°©λ²μ΄ μλ€
(2) this λ°μΈλ©μ νμ§ μλ ν¨μ
- ES6μμ νμ΄ν ν¨μλ
this
λ°μΈλ© κ³Όμ μμ²΄κ° λΉ μ Έμ μμ μ€μ½νμthis
λ₯Ό νμ© ν μ μλ€. λ°λΌμ ES6λΆν΄ μ°νλ²μ΄ λΆνμνλ€
(4) μ½λ°± ν¨μ νΈμΆμμμ this
- μ½λ°± ν¨μλ ν¨μλΌ κΈ°λ³Έμ μΌλ‘
this
κ° μ μκ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§, μ μ΄κΆμ λ°μ ν¨μμμ μ½λ°±ν¨μμ λ³λλ‘ thisκ° λ λμμ μ§μ ν κ²½μ°λ κ·Έ λμμ μ°Έμ‘°νκ² λλ€.
setTimeout(function () {
console.log(this), 300;
}); // (1) : window
[1, 2, 3, 4, 5].forEach(function (x) {
console.log(this, x); // (2) : window
});
document.body.innerHTML += '<button id ="a">ν΄λ¦</button>';
document.body.querySelector("#a").addEventListener("click", function (e) {
console.log(this, e); // (3) : document.body.querySelector('#a')
});
- λ€λ§ μ½λ°± ν¨μμμ
this
κ° λ¬΄μ‘°κ±΄μ μ΄μ§ μλ€
(5) μμ±μ ν¨μ λ΄λΆμμμ this
- μμ±μ ν¨μμμ νΈμΆλ κ²½μ°μ
this
λ μλ‘ λ§λ€ ꡬ체μ μΈ μΈμ€ν΄μ€ μμ μ΄λ€
var Cat = function (name, age) {
this.bark = "μΌμΉ";
this.name = name;
this.age = age;
};
var choco = new Cat("μ΄μ½", 7); // (1): Cat { bark: 'μΌμΉ', name: 'μ΄μ½', age: 7 }
var nabi = new Cat("λλΉ", 5); // (2): Cat { bark: 'μΌμΉ', name: 'λλΉ', age: 5 }
console.log(choco, nabi);
2. λͺ μμ this λ°μΈλ©
(1) call
- λ©μλ νΈμΆ μ£Όμ²΄μΈ ν¨μλ₯Ό μ¦μ μ€ννλ λͺ λ Ή
call
λ©μλμ 첫λ²μ§Έ μΈμλ₯Όthis
λ°μΈλ©νκ³ λλ¨Έμ§ μΈμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ ν λΉcall
λ©μλλ μμμ κ°μ²΄λ₯Όthis
λ‘ μ§μ κ°λ₯ν¨
var obj = {
a:1,
method:function(x,y){
console.log(this.a,x,y);
}
};
obj.method(2,3);
obj.method.call({a:4},5,6);
// 1 2 3
// 4 5 6
[Done] exited with code=0 in 0.051 seconds
call
λ©μλ νμ©
- μ μ¬λ°°μ΄κ°μ²΄μ λ°°μ΄ λ©μλ μ μ©ν λ
argument
,NodeList
μ λ°°μ΄ λ©μλ μ μ©ν λ- λ¬Έμμ΄μ λ°°μ΄ λ©μλ μ μ©ν λ
var obj1 = {
0: "a",
1: "b",
2: "c",
length: 3,
};
Array.prototype.push.call(obj1, "d");
console.log(obj1);
var arr1 = Array.prototype.slice.call(obj1);
console.log(arr1);
(2) apply
- κΈ°λ₯μ μΌλ‘
call
κ³Ό λμΌν¨ - μ°¨μ΄μ μ
call
λ©μλλ 첫λ²μ§Έ μΈμλ₯Ό μ μΈν λͺ¨λ μΈμλ€μ λ§€κ° λ³μλ‘ μ§μ νμ§λ§apply
λ©μλλ λλ²μ§Έ μΈμλ₯Ό λ°°μ΄λ‘ λ°μμ μ²λ¦¬
var func = function(a,b,c){
console.log(this,a,b,c);
}
func.apply({x:1},[4,5,6]);
var obj = {
a:1,
method:function(x,y){
console.log(this.a,x,y);
}
};
obj.method.call({a:4},5,6);
// { x: 1 } 4 5 6
// 4 5 6
[Done] exited with code=0 in 0.052 seconds
ES6
λμ
Array.from
var obj = {
0:'a',
1:'b',
2:'c',
length:3,
}
var arr =Array.from(obj);
console.log(arr);
// [ 'a', 'b', 'c' ]
[Done] exited with code=0 in 0.045 seconds
apply
λ©μλ νμ©
- μ΅λ/μ΅μκ° κ΅¬νλ μ½λ
var numbers = [10, 20, 3, 16, 45];
var max = Math.max.apply(null, numbers);
var min = Math.min.apply(null, numbers);
console.log(max, min);
ES6 λμ
Spread Operator
var numbers = [10, 20, 3, 16, 45];
var max = Math.max(...numbers);
var min = Math.min(...numbers);
console.log(max, min);
(3) bind
call
κ³Ό λΉμ·νμ§λ§ μ¦μ νΈμΆνμ§ μκ³ λ겨 λ°μthis
λ° μΈμλ€μ λ°νμΌλ‘ μλ‘μ΄ ν¨μλ₯Ό λ°ννκΈ°λ§ ν¨bind
μ ν΅μ¬μthis
λ₯Ό 미리 μ μ© , λΆλΆ μ μ© ν¨μλ₯Ό ꡬν
var func = function(a,b,c,d){
console.log(this,a,b,c,d);
}
func(1,2,3,4);
var bindFunc1 = func.bind({x:1});
bindFunc1(5,6,7,8);
// Window{...} 1 2 3 4
// { x: 1 } 5 6 7 8
[Done] exited with code=0 in 0.061 seconds
ES6 λμ : νμ΄ν ν¨μ
- νμ΄ν ν¨μλ
this
λ₯Ό λ°μΈλ©νλ κ³Όμ μ΄ μ μΈλμ - λ΄λΆμ
this
λ μκ³ μ κ·Όνλ©΄ κ°μ₯ κ°κΉμ΄ μ€μ½ν체μΈμthis
μ μ κ·Ό - λ°λ‘
this
μ°νν νμλ μκ³call/apply/bind
λ₯Ό μ μ© ν νμ μμ
(4) μ 리
- μ μ 곡κ°μμμ
this
: μ μκ°μ²΄(window
,global
..) - ν¨μ λ©μλμμμ
this
: λ©μλ νΈμΆ 주체 μ°Έμ‘° - ν¨μ νΈμΆμμμ
this
: ν¨μ νΈμΆ 주체 μ°Έμ‘° (κΈ°λ³Έμ μΌλ‘ μ μ κ°μ²΄ μ°Έμ‘°) - μ½λ°± ν¨μμμμ
this
: μ½λ°± ν¨μμ μ μ΄κΆμ λ겨λ°μ ν¨μ 주체 μ°Έμ‘° (κΈ°λ³Έμ μΌλ‘ μ μ κ°μ²΄ μ°Έμ‘°) - μμ±μ ν¨μμμμ
this
: μΈμ€ν΄μ€ λμ μ°Έμ‘°
νμ΄ν ν¨μλ₯Ό μ°λ©΄ this λͺ μμ λ°μΈλ©μ μ μ© ν νμκ° μλ€