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>
<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>
相关文章推荐
- js返回上一页的方法
- 递归遍历json
- HTML中javascript的<script>标签使用方法详解
- JS -- 判断字符串中是否包含中文
- 将将List json 转成List<?>实体
- 详解JavaScript逻辑And运算符
- 一些js技巧函数
- jscolor
- canvas绘图工具加上JavaScript特效绘制出能动的太阳系
- Error: [ng:areq] Argument controller Name is not a function, got undefined angular js报错问题解决
- JavaScript encodeURI 和encodeURIComponent
- 详解JavaScript逻辑Not运算符
- ExtJS 4无限制滚动条的Grid
- js验证身份证
- Chrome 中的 JavaScript 断点设置和调试技巧
- JavaScript基础——实现循环
- javascript克隆一个对象
- javascript模糊查询一个数组
- 高德地图的Js API 简单Demo,可以快速实现路点描线(摘自官方接口及自行修改测试)
- 【coder-pig 教程学习笔记5】Json 解析