js中的 call()和apply()

call() 和 apply()的作用

①  它们都可以修改函数中的 this指向

② 可以借用其他对象的方法

我们举个栗子来说明它的这两个作用

  // 修改函数内部 this 的指向
    function example(){
        console.log(this);
    }
    example();  // 打印出的this值是 window
    var obj = {
        "name":"xiaoyan",
        "age":23
    }
    example.apply(obj);  //打印的this 为Object
    example.call(obj);  //打印的this 为Object
稍后再来看它是如何借用其他对象的方法的,在此之前,先看看它们接收参数的问题

call() 和 apply 可以接收参数

① 对call() 来说,接收参数的格式为:

  call(对象,参数1,参数2,......)

② apply() 接收参数的格式为:

 apply(对象,[参数1,参数2,......])

所以,call() 和 apply() 应用的场景有所不同,

call 适合于参数个数已知的情况下,当参数个数不确定时,需要使用apply来实现。

在此,利用它们可以接收参数的属性来实现借用其他对象的方法的作用

 //参数个数已知,实现借用sum的方法
    function sum(a,b){
        return a*b+a;
    }
   var result= sum.call(obj,10,20);
   var result= sum.apply(obj,[10,20]);
    console.log(result);  // 210


当传入参数的个数未知时,可以使用apply来实现

 function sum(){
        return arguments[0]*arguments[1]+arguments[2];
    }
   var result= sum.apply(obj,[1,2,3]);
    console.log(result);  // 5 

其实call() 和 apply() 在参数方面还有一个不同点,就是期望的形参长度不一样

通过使用下面的方式就可以查看期望参数的长度

  函数.length

利用apply 实现伪数组转真数组

其实实现伪数组转真数组十分的简单,就一句代码就可以实现,请看下面代码

  var obj = {0:"name",1:"age",length:2}; //伪数组
    var arr =[];  // 空数组
    [].push.apply(arr,obj);
    console.log(arr);  //打印结果: ["name", "age"]

伪数组转真数组的实现,需要对前面我们写的两点进行理解,这里也进行进一步的解释:

①  前面我们知道了,谁调用方法,方法内部的 this 就指向谁,

② 注意 [].push 并不是调用push方法,而是找到 push方法

③ push.apply(arr,obj) ,将伪数组 obj 传递给了push方法 ,apply方法内部会自动取出伪数组的每一项传递给push 方法,可以理解为依次将伪数组中的元素push到了arr中

利用apply 实现真数组转伪数组

  var arr =["xiaoyan","zhongxi","minglang"];
    var obj={};
    [].push.apply(obj,arr);
    console.log(obj);  // {0: "xiaoyan", 1: "zhongxi", 2: "minglang", length: 3}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值