apply, call, bind
μλ² μ¬μ΄λμΈ java μ this μ javascript μ this κ° ν·κ°λ¦¬λ λΆλΆμ΄ λ§μλ°,
this μ κ΄λ ¨λ λ΄μ©μΈ call, apply, bind μ λν λ΄μ©μ΄ 5μ₯(μ°Έμ‘° νμ
) μ λμ μ΄ λΆλΆμ λ°λ‘ μ 리ν΄λ³΄κ³ μ νλ€.
this
- μ°μ this.. java μμλ μκΈ° μμ μ κ°λ¦¬ν€μ§λ§, javascript μμλ λ€λ₯΄λ€.
javascript μμμ this λ ν¨μκ° μ΄λ»κ² νΈμΆλμλμ§μ λ°λΌ
λ€λ₯΄κ² λμ μΌλ‘ 맀ν? λλ€.
1
2
3
4
5
6
7
8
9
10
|
var foo = function() {
console.log(this);
}
foo(); // this == window
var obj = {foo : foo};
obj.foo(); // this == obj
var instance = new foo(); // this == instance
|
νμ§λ§ μ΄λ κ²λ§ λλ€λ©΄ κ°λ¨νκ² μ§.. λ€μμ 보면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
1)
function foo() {
console.log(this); // this == window
function bar() {
console.log(this); // this == window
}
bar();
}
foo();
2)
var obj = {
foo : function() {
console.log(this); // this == obj
function bar() {
console.log(this); // this == window
}
bar();
}
};
obj.foo();
|
μ΄μΈμλ λ μκ² μ§λ§, λ΄λΆν¨μμ κ²½μ°μλ this λ μ μμ κ°λ¦¬ν€λ κ²μ μ μ μλ€.
μ°Ύμ보면 μ΄ λΆλΆμ μ€κ³ κ²°ν¨μΌλ‘
λ©μλκ° λ΄λΆν¨μλ₯Ό μ¬μ©νμ¬ μμ μ μμ
μ λκ² ν μ μλ€λ κ²μ μλ―Ένλ€
λΌκ³ νλλ°, λ€μ΄λ λ¬΄μ¨ λ§μΈμ§ μ…
μ¬ννΌ μ΄λ° λ¬Έμ λ‘ μΈν΄ this κ° μ μμ ννΌνλ λ°©λ²μ΄ μλλ°, κ·Έκ²μ΄ λ°λ‘ apply, call, bind μ΄λ€.
(λ¬Όλ‘ μ΄μ νμ¬μμ μ¬μ©νλ var me = this μ΄λ° λ°©μλ μκΈ΄ ν¨..)
apply
- this λ₯Ό νΉμ κ°μ²΄μ λͺ
μμ μΌλ‘ λ°μΈλ©
- Function.prototype.apply
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
obj.apply(thisArg, [argsArray])
//thisArg : ν¨μ λ΄λΆμ this μ λ°μΈλ©ν κ°μ²΄
// argsArray : ν¨μμ μ λ¬ν argument λ°°μ΄
--------------------------------------
var person = function(name) {
this.name = name;
}
var foo = {};
person.apply(foo, ['snack']);
console.log(foo); // {name : snack}
|
call
- apply()μ κΈ°λ₯μ κ°μ§λ§, 2λ²μ§Έ νλΌλ―Έν°κ° λ°°μ΄μ΄ μλ νλμ μΈμ
1
2
3
4
5
|
person.apply(foo, [1,2,3]);
person.call(foo, 1,2,3);
|
μ½λ°± ν¨μ κ°μ΄ λ΄λΆ ν¨μμ this λ₯Ό μν΄μ μ¬μ©λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function Person(name) {
this.name = name;
}
Person.prototype.doSomething = function (callback) {
if(typeof callback == 'function') {
callback.call(this);
}
};
function foo() {
console.log(this.name);
}
var p = new Person("snack");
p.doSomething(foo); // 'snack'
|
bind
- apply, call κ³Όλ λ€λ₯΄κ² ν¨μμ μΈμλ‘ μ λ¬λ this κ° λ°μΈλ©λ μλ‘μ΄ ν¨μλ₯Ό λ°ννλ€.
1
2
3
4
5
6
7
8
9
|
window.color = "red";
var o = {color : "blue"};
function sayColor() {
console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); // blue
|
- apply, call κ³Ό λ°©λ²μ λΉμ·νμ§λ§, νΈμΆμ νμ§ μκ³ ν¨μλ§ λ°ννλ€λ μ μ΄ λ€λ₯΄λ€.
1
|
call(this, 1,2,3) == bind(this)(1,2,3) // bind(this) λ λ°ν (1,2,3)μ΄ μ€ν
|