理解 call 和apply

一、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)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值