js 中arguments,call,apply,bind的使用

 //对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找

        //arguments是什么?

        //答:1:arguments是收到的实参副本

        //2:收到实参收集起来,放到一个arguments对象里

        //在词法分析中, 首先按形参形成AO的属性,值为undefined

        //当实参传来时, 再修改AO的相应属性.

        //t(a,b,c){}, 

        //调用时: t(1,2,3,4,5) 个参数

        //此时 , AO属性只有a,bc,3个属性, arguments里有1,3,3,4,5, 所有的值

        //对于超出形参个数之外的实参, 可以通过arguments来获得

        //3:arguments 的索引 从 0, 1,2,....递增,与实参逐个对应

        //4:arguments.length 属性代表实参的个数

        //5:Arguments一定不是数组, 是长的比较像数组的一个对象,虽然也有length属性

        //6:Arguments每个函数都会有,因此,arguemnts只会在内部找自身的arguments,

        //无法引用到外层的arguments

        //function t1(a,b,c)
        //{
        //    alert(arguments[1])  //2
        //    alert(arguments[4])  //5
        //    alert(arguments[5])  //6
        //    alert(a+"==="+b+"==="+c);  //1,2,3
        //}
        //t1(1, 2, 3, 4, 5, 6);
        //alert(arguments[1])   //无法引用到外层的arguments


        //call,apply,bind 区别:
        //在JS中,这三者都是用来改变函数的this对象的指向的
       // 1、都可以利用后续参数传参。
        //2、第一个参数都是this要指向的对象。
        //3、都是用来改变函数的this对象的指向的。
       // 例如:
        var zs = {
            name : "张三",
            gender : "",
            age : 20,
            say : function() {
                alert(this.name + " , " + this.gender + " ,今年" + this.age);                                
            }
        }
        var lisi = {
            name : "李四",
            gender : "",
            age : 25
        }
        zs.say();   //显示的肯定是张三 , 男 , 今年20。 那么如何用zs的say方法来显示lisi的数据呢。
       // call的用法:
        zs.say.call(lisi);
     
        //apply的用法:
        zs.say.apply(lisi);

        //而bind需要这样:
        zs.say.bind(lisi)();
    
       // 如果直接写zs.say.bind(lisi)是不会有任何结果的,call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
       //再看看下面例子

        var zs = {
            name : "张三",
            gender : "",
            age : 20,
            say : function(school,grade) {
                alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "" + grade);                                
            }
        }
        var lisi = {
            name : "李四",
            gender : "",
            age : 25
        }
   
        //可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
       // 对于call来说是这样的

        zs.say.call(lisi,"清华大学","一年级");       
 
       // 而对于apply来说是这样的

        zs.say.apply(lisi,["清华大学","一年级"]);
   
       // 区别:call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
        //那么bind怎么传参呢?它可以像call那样传参。

        zs.say.bind(lisi,"清华大学","一年级")();
      
        //但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

        zs.say.bind(lisi)("清华大学","一年级");

 

转载于:https://www.cnblogs.com/bin521/p/10435527.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值