所有的函数都默认包含apply和call这两种方法
调用函数的apply或call方法,就相当于调用该函数.不考虑函数内的this引用的话,这和类似于 直接调用函数的方式是一样的。
apply和call的功能是,通过传参的方式,强制函数内的this指定某一对象
下面是使用了apply方法和call方法的函数调用的例子:
function say(){ console.log(this.name); }
var robot = {name:"cup"};
say.apply(robot) // 打印结果为cup
//通过apply调用函数say。函数内的this引用引用了对象robot。
say.call(robot) // 打印结果为cup
//通过call调用函数say。函数内的this引用引用了对象robot
下面是使用了apply方法和call方法的对某对象的方法进行调用的例子:
var robot_1 ={
name:"cup",
say:function(){
console.log(this.name)
}
};
var robot_2 ={ name:"bower" };
robot.say() //打印结果为cup
robot_1.say.apply(robot_2) // 打印结果为bower
//通过apply调用robot_1.say方法。方法内的this引用引用了robot_2
robot_1.say.call(robot_2) // 打印结果为bower
//通过call调用robot_1.say方法。方法内的this引用引用了robot_2
注意:apply()和call()的不同之处:
apply与call之间的不同之处在于两者对其他参数的传递方式。
对于apply来说,剩余的参数将通过数组来传递,而call是直接按参数列表传递
下面的例子来了解这一差异:
function say(age, gender){console.log("My name is " + this.name + ",I'm a " + age + " years old " + gender + ".")}
say.apply({name:"cup"}, [12, "boy"]) //打印结果为 My name is cup,I'm a 12 years old boy.
// this.name = "cup", age = 12, gender = "boy" 作为第二个参数的数组中的元素都是函数say的参数,按顺序依次对应
say.call({name:"cup"}, 12, "boy") //打印结果为 My name is cup,I'm a 12 years old boy.
// this.name = "cup", age = 12, gender = "boy" 从第二个参数起的参数都是函数say的参数,按顺序依次对应
简答地说,他们的用途是一样的,唯一的区别就是所传对其它参数格式的不同,apply() 是用数组的格式,call() 是直接的参数列表的格式。