您的位置:首页 > Web前端 > JavaScript

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

2015-12-04 15:19 471 查看
当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: