之前一直迷惑,記不住call(),apply(),bind()的差別。不知道如何使用,一直處于懵懂的狀态。直到有一天面試被問到了這三個方法的差別,是以覺得很有必要總結一下。
如果有不全面的地方,後續再進行補充。
1. 改變this的指向
var obj = {
name : '張三',
age : 17,
myFun : function () {
console.log(this.name + ' ' + this.age);
}
}
var obj2 = {
name : '李四',
age : 20
}
obj.myFun() //張三 17
obj.myFun.apply(obj2) //李四 20
obj.myFun.call(obj2) //李四 20
obj.myFun.bind(obj2)() //李四 20
由例子可以看出,apply,call,bind都對this進行了重定向,apply和call使用方法相同。但是bind後面多了個(),因為bind傳回的是一個全新的函數,但是三個傳回結果一緻。
2. 傳參情況不同
var obj = {
name : '張三',
age : 17,
myFun : function (active,fm) {
console.log(this.name + ' ' + this.age + active + fm);
}
}
var obj2 = {
name : '李四',
age : 20
}
obj.myFun.apply(obj2,['愛學習','北京']); //李四 20愛學習北京
obj.myFun.call(obj2,'愛學習','北京'); //李四 20愛學習北京
obj.myFun.bind(obj2,'愛學習','北京')(); //李四 20愛學習北京
obj.myFun.call(obj2,['愛學習','北京'])();//李四 20愛學習,北京undefined
可以發現:apply參數傳遞用數組,并且在方法中會自動比對參數
call參數傳遞是直接放進去,每個參數之間用逗号隔開
apply如果用和call類似的傳遞參數的方法,則在方法中會自動比對參數。若像apply一樣傳遞參數,則會把整個數組 當作一個參數傳遞進去。