【Javascript 拾遗之四】arguments callee caller 三巨头
arguments callee caller 三巨头
1、arguments 定义
在之前的文章中(详见【javascript 拾遗之一】call 和 applay函数一文),我们已经知道arguments 是一个函数的内置对象类型,它是表示当前执行函数的参数列表key:value形式和length属性的对象,包含所有实参和参数个数。如下:
arguments = {
0 : arg0,
1 : arg1,
....
N-1 : argN
length : N
}
调用方法[functionName.]agruments
直接alert(arguments)返回的是[object Arguments]可见它是一种特殊的js内置对象。通过arguments[0]返回函数接受到的第一个参数,(注意这是对象调用属性的方法,不是数组调用索引的方式,Object[key] 等同于 Object.key), 通过arguments.length返回参数的个数,准确地说应该是实参的个数,大家可以测试下,设置多个实参,不设置形参,打印返回的值。而形参的个数可以通过argument.callee.length得到,第二节中介绍callee。
直接在函数中使用arguments不是很方便,因为它是一个对象类型,不利于遍历。so我们可以用Array.prototype.slice.call(arguments)来得到参数数组。下面来看一个arguments定义的测试例子。
1 var fun = function(aa, bb){ 2 console.warn(arguments); //[1, 2] 等同于 console.warn(fun.arguments); 3 alert(arguments); //[object Arguments] 4 console.warn(arguments.length); //2 5 console.warn(typeof arguments); //object 6 } 7 fun(1, 2);
1.1 arguments 作为可变参数函数的应用
实例中,我们可以任意添加sumUp函数的参数,并返回这些参数的和。
1 var sumUp = function(){ 2 var total = 0; 3 for(var i = 0; i < arguments.length, !isNaN(arguments); i ++){ 4 total += arguments[i]; 5 } 6 return total; 7 } 8 console.log(sumUp(1,2,3)); // 6 9 console.log(sumUp(1,2,3,4,5)); // 15
1.2 待续置位
1.3 待续置位
2、callee
callee是内置对象arguments的一个属性,通过调用 [functionName.]arguments.callee 返回当前执行函数的实体。
2.1 判断形参和实参的长度
callee的length参数表示形式参数的个数,可结合arguments.length用来判断实参和形参长度是否匹配。如下测试例子:
1 function calleeLengthDemo(arg1, arg2) { 2 if (arguments.length == arguments.callee.length) { 3 console.warn("验证形参和实参长度正确!"); 4 return; 5 } else { 6 console.warn("实参长度:" +arguments.length); //3 7 console.warn("形参长度: " +arguments.callee.length); //2 8 } 9 } 10 calleeLengthDemo(1,2,3);
3、caller
caller和arguments是同一级别的,通过调用[functionName.]caller 返回调用当前执行函数的函数,如果是此函数是顶层函数(即是全局函数,window对象下的函数),则返回null。详细见代码如下:
1 function callerDemo() { 2 if (callerDemo.caller) { 3 console.warn(typeof callerDemo.caller); //function 4 console.warn(typeof callerDemo.arguments.callee); //function 5 var a= callerDemo.caller.toString(); 6 alert(a); 7 var b= callerDemo.arguments.callee.toString(); 8 alert(b); 9 } else { 10 console.warn("This is a global function"); 11 } 12 } 13 callerDemo(); // This is a global function 14 function handleCaller() { 15 callerDemo(); 16 } 17 handleCaller();
5、总结
arguments 的应用其实有很多,形式多样,也可以和callee结合使用,本文只列举了几个例子,因此在开发中要举一反三,灵活应用才能得心应手。callee和caller很少使用到这两个属性,很多时候可以用函数的引用替代,但是我们也要能看懂吧,至少它们也是Javascript的一部分。
6、参考资料
http://hahha2003.blog.163.com/blog/static/2485779200961902819231/