zoukankan      html  css  js  c++  java
  • 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)("清华大学","一年级");
  • 相关阅读:
    Linux tar指令
    关于Json-lib类库的使用
    安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
    安卓开发笔记——TabHost组件(二)(实现底部菜单导航)
    安卓开发笔记——TabHost组件(一)(实现底部菜单导航)
    安卓开发笔记——ViewPager组件(仿微信引导界面)
    安卓开发笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)
    安卓开发笔记——Gallery组件+ImageSwitcher组件
    安卓开发笔记——GridView组件
    安卓开发笔记——WebView组件
  • 原文地址:https://www.cnblogs.com/bin521/p/10435527.html
Copyright © 2011-2022 走看看