在JS中,這三者都是用來改變函數的this對象的指向的,他們有什麼樣的區別呢。 在說區別以前仍是先總結一下三者的類似之處:數組
一、都是用來改變函數的this對象的指向的。bash
二、第一個參數都是this要指向的對象。app
三、均可以利用後續參數傳參。函數
call可讓函數執行,而且能夠改變函數執行時內部的this指向,this指向了call的第一個實參,call後邊的全部參數都被做爲實參傳給了前邊到的函數。ui
Function.prototype.myCall = function myCall(context, ...arg) {
context = context || window;
let a = Symbol();
context[a] = this;
let res = context[a](...arg);
delete context[a];
return res;
}
複製代碼
apply功能相似於call,可是第二個參數是個數組或者類數組的集合,雖然是以一個集合的形式傳過去的,可是接收時仍是散亂的接收的。this
Function.prototype.myApply = function myApply(context, arg) {
arg = arg || [];
context = context || window;
let a = Symbol();
context[a] = this;
let res = context[a](...arg);
delete context[a];
return res;
}
複製代碼
bind用法跟call同樣,bind返回值是一個新函數,新函數執行時fn纔會執行,fn中的this這時纔會被改爲新的指向。spa
Function.prototype.myBind = function (context, ...arg) {
var _this = this;
return function (...ary) {
return _this.apply(context, arg.concat(ary))
}
}
複製代碼