一、call和apply 的区别
call和apply的主要区别在于传参方式的不同
1. apply
apply接受两个参数,第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下
标的集合,这个集合可以为数组,也可以为类数组, apply 方法把这个集合中的元素作为参数传
递给被调用的函数:
var fn = function(a,b){
console.log(a + b + this.c)
}
var obj = {
c:3
}
fn.apply(obj, [1,2]) // 6
在这段代码中,参数 1、2 被放在数组中一起传入 fn 函数,它们分别对应 fn 参数列
表中的 a 、 b 。this 指向对象obj
2. call
call接受多个参数,第一个参数指定函数体内 this 对象的指向,剩下的参数作为参数传递给被调用的函数
var fn = function(a,b){
console.log(a + b + this.c)
}
var obj = {
c:3
}
fn.apply(obj, [1,2]) // 6
在这段代码中,参数 1、2 被传入 fn 函数,它们分别对应 fn 参数列
表中的 a 、 b 。this 指向对象obj
* 有时候我们使用 call 或者 apply 的目的不在于指定 this 指向,而是另有用途,比如借用其
他对象的方法。那么我们可以传入 null 来代替某个具体的对象:
// 例如:获取数组中最大值或最小值
var arr = [1,2,3,4,5,6,7,8]
Math.max.apply(null, arr) // 8
二、call和apply的用途
1、改变this的指向
var obj1 = {
name: 'obj1'
};
var obj2 = {
name: 'obj2'
};
window.name = 'win';
var getName = function(){
alert ( this.name );
};
getName(); // 输出: win
getName.call( obj1 ); // 输出: obj1
getName.call( obj2 ); // 输出: obj2
当执行 getName.call( obj1 ) 这句代码时, getName 函数体内的 this 就指向 obj1 对象,所以
此处的函数相当于:
var getName = function(){
alert ( obj1.name );
};
2、 借用其他对象的方法
例如:函数中的arguments 是一个类数组,不具有数组的push方法,可以通过借用array的push方法进行添加
function LikeArrayPush() {
Array.prototype.push.call(arguments, 3)
console.log(arguments) // [1,2,3]
}
LikeArrayPush(1,2)