阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JavaScript arguments 对象

      功能:存放实参的参数列表

      test1(1,2);//[1,2]
      test1(1,2,3,4,5);//[1, 2, 3, 4, 5]
      function test1(){
        console.log(arguments);
      }
      
      

      argutments在普通模式里,可以在函数内部修改函数的值,但是不建议那么做;这点在严格模式下也有限制

      • 在严格模式,函数内部不能修改argument的值,即使修改了,操作也是无效的;
      • 其次重写arguments值会导致语法错误,代码不执行;

      特性:

      • 仅能在函数体内使用

        test1(1,2);//[1,2]
        function test1(){
        console.log(arguments);
        }
        console.log(arguments);//Uncaught ReferenceError: arguments is not defined
        
        
      • 带有下标属性,但是并非数组

        test1(1,2);//1 2 undefined
        function test1(){
        console.log(arguments[0],arguments[1],arguments[2]);
        }
        
        
      • 函数声明时自动初始化

      • 属性

        • 1.length 获取函数实参的长度

          test1(1,2,3,4,5);// 输出5
          function test1(){
          console.log(arguments.length);
          }
          
        • 2.callee 返回当前正在指向的函数

          test1(1,2,3,4,5);// 输出函数本身
          function test1(){
          console.log(arguments.callee);
          }
          
        • 3.caller 返回调用当前正在执行函数的函数名;在chrome里是没有的;尽量不要用arguments的这个属性;

          • 在chrome里的callee是arguments.callee.caller
          • 对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。

            function callerDemo() {
            if (arguments.callee.caller) {
                var a = callerDemo.caller.toString();
                console.log(a);
            } else {
                console.log("this is a top function");
            }
            }
            function handleCaller() {
            callerDemo();
            }
            handleCaller();
            function calleeDemo() {
            console.log(arguments.callee);
            }
            calleeDemo();
            

      函数的参数是函数的灵魂

      ECMA中的函数不在乎传来多少个参数,也不在乎你传进来的是什么类型的,即使你定义的函数值接受两个参数,在调用的时候未必严格的传进两个实参,你传一个,三个,不传都是没有问题的、这就是函数的多态

      原理是因为ECMA是把函数用在内部用一个”数组”来表示的,函数接受到的始终都是这个数组,并不关心这个”数组”是否包含参数,已经包含的都是什么参数,可以通过arguments[index]这种的方式来访问,也可以通过arguments.length的值来确定传进来了多个参数;

      function testArgument(){
          console.log("hello argument[0]:"+arguments[0]+" and argument[1]:"+arguments[1]);
      }
      testArgument("1","2");//hello argument[0]:1 and argument[1]:2
      testArgument("1");//hello argument[0]:1 and argument[1]:undefined
      testArgument();//hello argument[0]:undefined and argument[1]:undefined
      

      函数的一个特点,形参只是提供了操作的便利,但并不是必须的;函数的定义和调用与参数是没有关系的,只有在函数内部引用了形参才与实参个数和值有关系;

      如果函数只是定义了,但是没有执行,那就是脱裤子放屁了;因为对程序不会有任何意义;

      function sum(a,b){
          if(arguments.length===2){
              console.log("第1个参数和第二个参数的和是:"+a+b);
          }else if(arguments.length===1){
              console.log("block,只传了一个参数 "+a+",让我如何相加")
          }else{
              console.log("我拒绝运算!")
          }
      }
      sum(10,8);//第1个参数和第二个参数的和是:108
      sum(10);//block,只传了一个参数 10,让我如何相加
      sum();//我拒绝运算!
      

      上面就牵扯到了函数的多态,根据不同的参数来做不同的事情;

      卖前端学习教程

      只需几十元,就能买到培训班的内部教程!开启高薪之路!

      零基础小白阿里P7的教程都有!

      同时长期收购所有培训班的前端教程

      目录
      目录