標籤:傳遞 display name 匹配 結果 call() 傳參 spl 之間
之前一直迷惑,記不住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() //張三 17obj.myFun.apply(obj2) //李四 20obj.myFun.call(obj2) //李四 20obj.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一樣傳遞參數,則會把整個數組 當作一個參數傳遞進去。
javascript中的call(),apply(),bind()方法的區別