在JavaScript中,call
、apply
和bind
是Function
對象自帶的三個方法
共同點:
(1) 都是用來改變函數的this對象的指向的
(2)第一個參數都是this要指向的對象,也就是想指定的上下文
(3)都可以利用後續參數傳參
區別:
bind
是返回對應函數,便於稍後調用;apply
、call
則是立即調用
1. call
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明:call
方法可將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象
用法:
function Animal(name){
this.name=name;
this.showName=function(){
console.log(this.name);
}
}
function Dog(name){
Animal.call(this,name); // 可視爲繼承Animal
}
var dog=new Dog("Crazy dog");
dog.showName(); // Crazy dog
2. apply
apply([thisObj[,argArray]])
說明:如果 argArray 不是一個有效的數組或者不是 arguments 對象,那麼將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數。
function class1(args1,args2){
this.name=function(){
console.log(args,args);
}
}
function class2(){
var args1="1";
var args2="2";
class1.call(this,args1,args2);
/*或*/
class1.apply(this,[args1,args2]);
}
var c=new class2();
c.name();
- bind
MDN的解釋是:bind()
方法會創建一個新函數,稱爲綁定函數,當調用這個綁定函數時,綁定函數會以創建它時傳入 bind()
方法的第一個參數作爲 this
,傳入 bind()
方法的第二個以及以後的參數加上綁定函數運行時本身的參數按照順序作爲原函數的參數來調用原函數。
注意:bind
方法的返回值是函數
var bar=function(){
console.log(this.x);
}
var foo={
x:3
}
bar(); // undefined
bar.bind(foo)(); // 3
/*或*/
var func=bar.bind(foo);
func();