阿西河

所有教程

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

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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();//我拒绝运算!
      

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

      目录
      目录