js函数的实参对象arguments 和其2个属性callee、caller

来源:互联网 发布:淘宝切片详情页上传 编辑:程序博客网 时间:2024/04/30 01:12
当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为undefined值。因此,应当给省略的参数赋一个合理的默认值。
<script type="text/javascript">
  //将对象o中可枚举的属性名追加到数组a中,并返回这个数组a
  //如果省略a,则创建一个新数组并返回这个新数组
  function getPropertypeNames(o,a){
    a = a || []; //如果未定义,则使用新数组
    for(var property in o){
      a.push(prototype);
    }
    return a;
  }


  //这个函数调用可以传入1个或2个实参
  var a = getPropertypeNames(o); //将o的属性存储到一个新数组中
  getPropertypeNames(p,a); //将p的属性追加到数组a中
</script>


可变长的实参列表:实参对象
当调用函数的时候传入的实参数超过函数定义时的形参个数时,没有办法直接获得未命名值的引用。参数对象解决了这个问题。
再函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象,这样可以通过数字下标就能访问传入函数的实参值。


实参对象再很多地方都非常有用,下面例子展示了使用它验证实参的个数,从而调用正确的逻辑:
<script type="text/javascript">
  function f(x,y,z){
    //首先,验证传入实参的格式是否正确
    if (arguments.length != 3) {
      throw new Error("要求3个参数");
    };
    //再执行函数的其他逻辑...
  }
</script>


记住,arguments并不是真正的数组,它是一个实参对象。可以这样理解,它是一个对象,只是碰巧具有以数字为索引的属性。


【js函数实参对象的 callee 和 caller属性】
除了数组元素,实参对象还定义了 callee 和 caller 属性。
callee属性指代当前正在执行的函数;caller属性指代调用当前正在执行的函数的函数。
<script type="text/javascript">
  //callee属性再某些时候会非常有用,比如再匿名函数中通过callee属性来递归调用自身
  var factorial = function(x){
    if(x <= 1) return 1;
    return x * arguments.callee(x-1);
  }
</script>
0 0
原创粉丝点击