call apply 和 bind
apply接受两个参数。第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合。
call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数。
如下:
var func = function(a,b,c)
{
alert(a + b + c);
}
func.apply(null,[1,2,3]);//弹出6
func.call(null,1,2,3);//弹出6
apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合(这个集合可以是数组,也可以为类数组)。apply方法把这个集合的元素作为参数传递给被调用的函数。
varfunc =function( a, b, c ){
console.log([a,b,c]) ;//输出[1, 2, 3]}
console.log(func())
func.apply(null, [1,2,3])
1、改变this的指向
varperson= {name:"lili"}
functiongetName() {
console.log(this.name)
}
getName(person) //undefined
getName.call(person) //lili
getName.apply(person) //lili
getName.bind(person)
2、调用其他对象的函数
3.bind使用
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
}
}
};
alert(object.getNameFunc()()); //"The Window"
object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的全局对象
解决这一问题,可以像下面这样,将匿名函数外部作用域中this对象保存在闭包能够访问到的变量中
varname = "The Window";varobject ={
name:"My Object",
getNameFunc:function() {returnfunction() {returnthis.name;
}
}
};varfunc=object.getNameFunc();
alert(func.apply(object));//"My Object"
通过apply、call,已经可以输出预期的My Object
但是,每次调用时都需要以func.apply(object)的形式调用,这不是很怪么
理想的调用方式,当然是在通过某种处理后,之后可以以func()形式调用,像下面这样
varname = "The Window";varobject ={
name:"My Object",
getNameFunc:function() {returnfunction() {returnthis.name;
}
}
};varfunc=object.getNameFunc();
func=func.bind(object);
alert(func());//"My Object"