在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();