• js-arguments的认识


    作者:zccst



    2014-6-10  自己构造一个Array like
    类数组的构成要点:
    1,元素是数组式索引
    2,有length属性

    Js代码  收藏代码
    1. var test3 = {  
    2.     0 : 10,  
    3.     1 : function(){  
    4.         return this[0];  
    5.     },  
    6.     length:2  
    7. }  
    8. console.log(Array.prototype.slice.call(test3));//打印[10, function()]  





    2014-6-9
    函数参数arguments是类数组,但不是数组。(arguments是对象)
    如果希望转成真正的数组,则可以
    var slice = [].slice;
    slice.call(arguments);
    也可以:Aarray.prototype.slice.call(arguments);

    Js代码  收藏代码
    1. var o = {  
    2.     name:"javascript"  
    3. };  
    4. var f1 = function(){  
    5.     return 2;  
    6. }  
    7. var foo = function(a,b,c){  
    8.     console.log(arguments, typeof arguments, $.type(arguments), typeof arguments.push);  
    9.     //[100, function(), Object { name="javascript"}] object object undefined  
    10.   
    11.     //尽管arguments不是数组,但仍可以通过for循环取出每一个元素  
    12.     for (var i in arguments ){  
    13.         console.log(arguments[i]);  
    14.     }  
    15.     /*打印 
    16.         100 
    17.         function() 
    18.         Object { name="javascript"} 
    19.     */  
    20.   
    21.     //现在让数组的slice运行在arguments的context中,参数为0,则将arguments转成了数组,(arguments本身没变)  
    22.     var ret = Array.prototype.slice.call(arguments);  
    23.   
    24.     console.log(ret, typeof ret, $.type(ret), typeof ret.push);  
    25.     //[100, function(), Object { name="javascript"}] object array function  
    26. }  
    27. foo(100,f1,o);  










    基础介绍
    js进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments。
    一、arguments可以用arguments[index]这样的语法取值,拥有长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,例如:

    Js代码  收藏代码
    1. function func(a,b){  
    2.     alert(a);  
    3.     alert(b);  
    4.     for(var i=0;i<arguments.length;i++){  
    5.         alert(arguments[i]);  
    6.     }  
    7. }  
    8. func(1,2,3,4);  


    代码运行时会依次显示:1,2,1,2,3,4。函数定义了两个参数,但是在调用的时候传递了4个参数。

    二、arguments的callee属性
    它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性。例如:用递归来计算1到n的自然数之和:

    Js代码  收藏代码
    1. var sum=function(n){  
    2.     if(1==n) {  
    3.         return 1;  
    4.     } else {  
    5.         return n + arguments.callee(n-1);  
    6.     }  
    7. }  
    8. alert(sum(100));  


    arguments.callee表示引用当前正在执行的函数,或者说是调用arguments.callee的函数对象的引用,它给匿名函数提供了一种自我引用的方式。





    更深入,包括了caller, call, apply

    Js代码  收藏代码
      1. /* 
      2.  * 演示arguments的用法,如何获取实参数和形数数 
      3.  */  
      4. function argTest(a,b,c,d){  
      5.     var numargs = arguments.length;     // 获取被传递参数的数值。  
      6.     var expargs = argTest.length;       // 获取期望参数的数值。  
      7.     alert("实参数目为:"+numargs)  
      8.     alert("形数数目为:"+expargs)  
      9.   
      10.     alert(arguments[0])           
      11.     alert(argTest[0])          //undefined 没有这种用法  
      12. }  
      13. //argTest(1,2)  
      14. //argTest(1,2,3,4,5)  
      15.   
      16.   
      17. /* 
      18.  *  arguments不是数组(Array类) 
      19.  */  
      20.   
      21. Array.prototype.selfvalue = 1;  
      22. function testAguments(){  
      23.     alert("arguments.selfvalue="+arguments.selfvalue);  
      24. }  
      25. //alert("Array.sefvalue="+new Array().selfvalue); // 1  
      26. //testAguments();  //arguments.selfvalue = undefined  
      27.   
      28.   
      29.   
      30. /* 
      31.  * 演示函数的callee属性. 
      32.  * 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数 
      33.  */  
      34. function calleeDemo() {  
      35.     alert(arguments.callee);  
      36. }  
      37. //calleeDemo();  
      38. //(function(arg0,arg1){alert("形数数目为:"+arguments.callee.length)})();  
      39.   
      40.   
      41.   
      42.   
      43. /* 
      44.  * 演示函数的caller属性. 
      45.  * 说明:(当前函数).caller:返回一个对函数的引用,该函数调用了当前函数 
      46.  */  
      47.   
      48. function callerDemo() {  
      49.     if (callerDemo.caller) {  
      50.         var a= callerDemo.caller.arguments[0];  
      51.         alert(a);  
      52.     } else {  
      53.         alert("this is a top function");  
      54.     }  
      55. }  
      56. function handleCaller() {  
      57.     callerDemo();  
      58. }  
      59.   
      60. //callerDemo();  
      61. //handleCaller("参数1","参数2");  
      62.   
      63.   
      64.   
      65.   
      66.   
      67. /* 
      68.  * 演示apply,call函数的用法 
      69.  * 说明:作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别: 
      70.  *       apply(thisArg,argArray); 
      71.  *     call(thisArg[,arg1,arg2…] ]); 
      72.  *     即所有函数内部的this指针都会被赋值为thisArg 
      73.  */  
      74.   
      75.  function ObjectA(){  
      76.     alert("执行ObjectA()");  
      77.     alert(arguments[0]);  
      78.     alert(this.b);//在ObjectB中用call/apply调用ObjectA时,ObjectB的变量b的值。  
      79.     this.hit=function(msg){alert(msg)}  
      80.     this.info="我来自ObjectA"  
      81.  }  
      82.    
      83.  function ObjectB(){  
      84.     alert("执行ObjectB()");  
      85.     this.b = '2b';  
      86.     //调用ObjectA()方法,同时ObjectA构造函数中的所有this就会被ObjectB中的this替代  
      87.     ObjectA.apply(this,arguments);//ObjectA.call(this);  
      88.     alert(this.info);  
      89.  }  
      90.  //ObjectB('参数0');  
      91.   
      92.   
      93.  var value="global 变量";  
      94.  function Obj(){  
      95.     this.value="对象!";  
      96.  }  
      97.  function Fun1(){  
      98.     alert(this.value);  
      99.  }  
      100.  //Fun1();  
      101.  //Fun1.apply(window);   
      102.  //Fun1.apply(new Obj());  
  • 相关阅读:
    紫色飞猪的研发之旅--07client-go实现进入pod模拟终端登录
    紫色飞猪的研发之旅--06go自定义状态码
    紫色飞猪的研发之旅--05go封装http请求
    紫色飞猪的研发之旅--04client-go客户端
    紫色飞猪的研发之旅--03golang:获取cookie
    支持remote write和exemplar的prometheus服务
    从头编写一个时序数据库
    解析Prometheus PromQL
    老板:把系统从单体架构升级到集群架构!
    小白自制Linux开发板 三. Linux内核与文件系统移植
  • 原文地址:https://www.cnblogs.com/shsgl/p/4289868.html
Copyright © 2020-2023  润新知