Apply,Call,Bind 에 λŒ€ν•΄

· β˜• 2 min read · πŸ‘€... views

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)이 μ‹€ν–‰
Share on

snack
WRITTEN BY
snack
Web Programmer


What's on this Page