call()
应用于:Function 对象
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
使用例子:
var person1 = {
name : "qqq",
fn: function(){
console.log(this.name);
}
}
var person2 = {
name : "www",
fn: function(){
console.log(this.name);
}
}
console.log(person1.fn()) //qqq
console.log(person1.fn.call(person2 )) //www
此处调用了call(),因为传入的是person2,所以this.指向的也是person2.name,也就是“www”。
注意到,call()与apply()的区别:功能一样。第二个参数形式不一样。call传递多个参数,是任意形式。apply第二个参数必须是数组形式。
用代码来理解它们区别最好:
a.call(b,2,3); ==> a.apply(b,[2,3]);//数组形式传入
就是利用了apply参数是数组的特性。结合函数的隐性参数,都会自动保存在arguments数组中。这样,使用apply的方式:
this.initialize.apply(this, arguments);
可以直接将当前函数的arguments数组作为apply的第二个参数传入,不需要转化。
bind()的作用与call()和apply()一样,都是可以改变函数运行时上下文,区别是call()和apply()在调用函数之后会立即执行,而bind()方法调用并改变函数运行时上下文后,返回一个新的函数,供我们需要时再调用。
var person = {
name: "qqq",
getName:function(){
return this.name;
}
}
var boy = {
name:"www",
}
//bind()返回一个新的函数,以便后面调用
var newFn = person.getName.bind(boy);
//调用该函数
console.log(newFn())//输出www