call, apply는 꽤나 이전에 this의 바인딩에서 배운 개념들이지만 오늘은 온라인 세션에서 bind까지 넣은 function methods라는 이름으로 배웠다. 복습 겸 정리를 해본다.
- Function.prototype.call()
- Function.prototype.apply()
function add(x, y){
this.val = x + y;
console.log(this.val);
}
let obj = { val: 0 };
add.apply(obj, [2, 8]); // 10
add.call(obj, 2, 8); // 10
// 위와같이 apply는 인자로 배열이나 유사배열(array-like)로 받고, call은 인자를 콤마로 분리해서 받는다.
// 활용례 1
let arr = [7, 24, 13, 2, 1];
let minimum = Math.min.apply(null, arr);
// Math.min의 기능만 사용하려고 하는 것이고, this는 의미가 없으므로 null을 넣어줘도 된다고 한다.
// 활용례 2
function test(){
/* // 이 코드는 실행할 수 없다. arguments는 array-like object라서 forEach를 사용할 수 없기 때문이다.
arguments.forEach((val) => {
console.log(val);
})
*/
Array.prototype.forEach.call(arguments, function(val){ console.log(val); })
}
출처: 거의 코드스테이츠의 수업 슬라이드
- Function.prototype.bind()
let obj = {
name: 'john',
timer: function(){
console.log(this.name);
}
}
setInterval(obj.timer, 1000); // 원래 'john'이 1초마다 출력돼야 하지만, 아무것도 출력되지 않는다.
// setInterval은 함수의 this를 자동으로 window에 바인드 시키기 때문이다.
// 아래와 같이 하면 된다.
setInterval(obj.timer.bind(obj), 1000); // 정상적으로 출력됨을 알 수 있다.