callee
是arguments对象的一个属性,然而在ES5开始就移除了,加入callee主要是为了解决存在匿名函数调用自身函数所引发的问题
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。
调用callee返回该函数,这就能在匿名函数中有递归的效果了eg:
[1,2,3].map(function(n){ return !(n > 1) ? : arguments.callee(n - 1) * n; })
当然替代方案是在回调函数定义别名,再调用eg:[1,2,3].map(function factorial (n) { return !(n > 1) ? 1 : factorial(n-1)*n; });
1.该函数可以像代码内部的任何其他函数一样被调用 2.它不会在外部作用域中创建一个变量 (除了 IE 8 及以下) 3.它具有比访问arguments对象更好的性能
当然这种方式也是存在问题的,当在匿名函数中递归调用并且在使用this时eg:
var global = this;
var sillyFunction = function (recursed) {
if (!recursed) { return arguments.callee(true); }
if (this !== global) {
alert("This is: " + this);
} else {
alert("This is the global");
}
}
sillyFunction();
使用callee来实现阶乘eg:
function create() { return function(n) { if (n <= 1) return 1; return n * arguments.callee(n - 1); }; } var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)
这种方式同样可以使用函数命名方式改写eg:function create() { return function temp(n) { if (n <= 1) return 1; return n * temp(n - 1); }; } var result = create()(5);
所以这只是另一种方式而已,不过现在还是不推荐使用callee了
caller
caller 返回一个函数的引用,这个函数调用了当前的函数
1 这个属性只有当函数在执行时才有用
2 如果在javascript程序中,函数是由顶层调用的,则返回null
function a(){ reutrn a.caller; } a() // null 函数由顶层调用百度已收录
js函数中使用callee:等您坐沙发呢!