• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Arguments对象

php 搞代码 4年前 (2022-01-04) 37次浏览 已收录 0个评论

调用对象定义了一个特殊的属性,名称arguments,它实际上引用了一个特殊对象Arguments对象,因为Arguments属性是调用对象的一个属性,因此它的状态和局部变量以及形参是相同的。arguments.length可以获取传递给参数的实参数量
废话不多少,例子说明一切

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  <HTML>   <HEAD>   </HEAD>   <BODY>   <SCRIPT LANGUAG<i style="color:transparent">来源gaodai$ma#com搞$代*码网</i>E="JavaScript">   <!--      function f(x,y,z)      {          if (f.length !=arguments.length)          {              //可以通过读取函数的length和arguments的length属性值来检查形式参数的数量是否相等              //因为前者恰好是形参的数量,而后者是实参数量              //如果不相等抛出异常              throw new Error('function f called with' +arguments.length+'arguments,but it expects'+f.length+'arguments');          }          else           {              document.write("f("+[x,y,z]+')'+'<br/>');          }      }        try      {          f(1,2,3);          f(2,4);//抛出异常,后面的将不再执行          f(4);          f("a","b","c","d","e","f");      }      catch (ex)      {          document.write(ex.message);      }   //-->   </SCRIPT>       </BODY>  </HTML>

运行结果:

Java代码

f(1,2,3)  function f called with2arguments,but it expects3arguments

arguments的行为有点想数组,但它其实并不是数组,它不具备JavaScript核心数组的一些方法如join、sort、slice等

一个使用arguments对象那个接收任意参数的例子

Java代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  <HTML>   <HEAD>   </HEAD>     <BODY>    <SCRIPT LANGUAGE="JavaScript">    <!--      function f()      {// 利用arguments来读取任意个数的参数          document.write("f(" +Array.apply(null,arguments) + ")" +"<br/>");//apply()应用某一对象的一个方法,用另一个对象替换当前对象。      }      f(1,2,3);      f("a","b");      f(true);    //-->    </SCRIPT>   </BODY>  </HTML>

一个使用arguments对象模拟函数重载的例子

Java代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  <HTML>   <HEAD>    <TITLE> New Document </TITLE>   </HEAD>     <BODY>    <SCRIPT LANGUAGE="JavaScript">    <!--      function Point()      {          if(arguments.length ==0)//如果没有参数          {              //默认的xy属性都设置0              this.x=0;              this.y=0;              this.toString=function()                  {                      return this.x+" "+ this.y ;                  }          }            else if (arguments.length <2)//如果实参小于2          {              var p=arguments[0];              if (p instanceof Point )//判断实参类型如果是Point,那么执行属性复制              {                  this.x =p.x;                  this.y =p.y                  this.toString=function()                  {                      return this.x+" "+ this.y ;                  }              }              else if ( typeof p=="number" || p instanceof Number)//如果是数值,那么这个值作为当前Point的x属性值,y属性默认0              {                  this.x=(Number)(p);                  this.y=0;                  this.toString=function()                  {                      return this.x+" "+ this.y ;                  }              }              else              {//如果这个参数既不是Point又不是Number,抛出类型异常                  throw new TypeError("参数类型错误!")              }          }          else if (arguments.length==2)          {              var x= arguments[0];              var y= arguments[1];              //否则当参数数量为两个并且为number类型的时候,把她们分别作为Point的xy              if ((typeof x=='number' || x instanceof 'Number') && typeof y == 'number' ||y instanceof 'Number')              {                  this.x = x;                  this.y = y;                  this.toString=function()                  {                      return this.x+" "+ this.y ;                  }              }              else                  throw new TypeError('参数类型错误!');          }          else          {              throw new TypeError("参数类型错误!");          }        }      function dwn(s)      {          document.write(s+"<br/>");      }      dwn(new Point());//00      dwn(new Point(new Point()));//00      dwn(new Point(3));//30      dwn (new Point(4,5));//45    //-->    </SCRIPT>   </BODY>  </HTML>

需要注意的是:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参与一定会影响到对应的命名参数,反之亦然如:

Java代码

function f(x)  {     alert(x);//参数初始值     arguments[0]++;//改变参数的值     alert(x);//x的值发生了改变  }

Arguments对象还提供了一个有用的属性叫做callee,它被用来应用当前正在执行的函数,它提供了一种匿名的递归调用能力,这对于闭包说非常有用,如:
用闭包计算10的阶乘

Java代码

function(x){     return x>1?x*arguments.callee(x-1):1  }(10);

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Arguments对象

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址