JavaScript arguments callee caller 学习笔记
2016-07-08 11:59
447 查看
arguments
假设定义了一个函数a,函数a的实际参数只有一个x,如果调用这个函数a的时候传入两个实参,第一个实参可以根据参数名x来获得,也可以通过类数组对象arguments[0]来获取,而第二个实参就只能通过arguments[1]来得到,跟js真正的数组一样,arguments对象也包含一个length属性,用来记录和标识该对象所包含的元素的个数,所以,如果调用函数a传入了两个参数,length的值就为2,如果调用函数时没有传入形参,arguments对象为null;
在非严格模式下,如果一个函数包含若干个形参,实参对象的数组元素是函数形参所对应实参的别名,实参对象中以数字索引,如果通过实参的名字来修改实参的值,arguments对象中对应的值也会发生改变。
arguments对象使用范例:
arguments对象中的callee属性和caller属性
实参对象arguments除了数组元素之外,该对象还定义了callee和caller属性。在ECMAScript5的严格模式下,对实参对象中的这两个属性操作都会产生一个类型错误:
而在非严格模式下,ECMAScript标准规范规定callee属性指代当前正在执行的函数。caller是非标准的,但是绝大多数的浏览器都实现了这个属性,它指代当前执行函数的函数,callee通常用于匿名函数调用。
使用callee属性实现递归(函数自己调用自己)
caller使用示例
假设定义了一个函数a,函数a的实际参数只有一个x,如果调用这个函数a的时候传入两个实参,第一个实参可以根据参数名x来获得,也可以通过类数组对象arguments[0]来获取,而第二个实参就只能通过arguments[1]来得到,跟js真正的数组一样,arguments对象也包含一个length属性,用来记录和标识该对象所包含的元素的个数,所以,如果调用函数a传入了两个参数,length的值就为2,如果调用函数时没有传入形参,arguments对象为null;
//需要三个形参的函数 function testArgs(a , b ,c ){ //判断调用函数时传入的形参个数是否正确 if(arguments.length != 3) //如果传入形参个数不等于3个,抛出异常信息 throw new Error("调用函数错误,参数个数不一致"); //执行其他逻辑 return a + b + c; }
在非严格模式下,如果一个函数包含若干个形参,实参对象的数组元素是函数形参所对应实参的别名,实参对象中以数字索引,如果通过实参的名字来修改实参的值,arguments对象中对应的值也会发生改变。
//上述文字示例 function demo2(a){ console.log("修改前参数a的值:" + a); a = 100; console.log("修改后arguments对应的值:" + arguments[0]); } //调用函数 demo2(10);
arguments对象使用范例:
//查找传入函数的数字中最大的值 //"/*...*/"表示可以接受任意个数的参数 function findMaxNumber(/*...*/){ //定义一个无限值 var max = Number.NEGATIVE_INFINITY; //遍历arguments对象,查询并记录最大值; for(var i = 0; len = arguments.length; i < len; i ++){ //判断当前值是否大于最大值Max变量 if(arguments[i] > max) //将值存入最大值变量中 max = arguments[i]; } //遍历完对象,返回最大值 return max; } //调用函数 findMaxNumber(1,2,3,4,5,6,7,8,9,10); ⇒ 10;
arguments对象中的callee属性和caller属性
实参对象arguments除了数组元素之外,该对象还定义了callee和caller属性。在ECMAScript5的严格模式下,对实参对象中的这两个属性操作都会产生一个类型错误:
Uncaught TypeError: Cannot read property 'length' of undefined
而在非严格模式下,ECMAScript标准规范规定callee属性指代当前正在执行的函数。caller是非标准的,但是绝大多数的浏览器都实现了这个属性,它指代当前执行函数的函数,callee通常用于匿名函数调用。
使用callee属性实现递归(函数自己调用自己)
//将匿名函数赋值给一个变量 var factorial = function(num){ if(num <= 1) return 1; //递归调用自身函数; return num * arguments.callee(num - 1); } //调用函数 var test = factorial(10);⇒ 1*2*3*4*5*6*7*8*9*10=3628800
caller使用示例
//定义一个函数,返回调用函数的函数 function callerFn() { //函数被直接执行时callerFn.caller为空 if (callerFn.caller) { //返回执行当前函数的函数的toString方法 return callerFn.caller.toString(); } else { alert("函数直接执行"); } } //调用函数 function handleCaller() { callerFn(); } handleCaller(); callerFn();
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解