我还没有找到这个变量的任何完整的跨浏览器文档。
什么是arguments.callee
?它是如何工作的?
它有哪些论据?
答案 0 :(得分:27)
arguments.callee
是对当前正在调用的函数的引用。首先要做的事情是:不要使用它:如果你处于严格的环境中,它只会出现错误。
然而,亲自 - 和I'm not alone in this - 我会想念这个属性。在我解释原因之前,我会给你一个伪示例,说明何时使用它:
var looper = (function(someClosureVar)
{
setTimeout((function(resetTimeout)
{
return function()
{
//do stuff, stop OR:
resetTimeout();
};
}(arguments.callee)),1000);
}(document.getElementById('foobar')));
我希望你喜欢闭包,因为我这样做 - 这就是arguments.callee
很可能发生的地方。倒数第二行是资金的来源:
(arguments.callee)
是对闭包范围内设置初始超时的匿名函数的引用(在这种情况下可以访问1个DOM元素)。匿名函数在返回后是GC'ed,但在这种情况下,我已将它添加到超时回调的作用域(将其作为参数传递给另一个返回实际回调的匿名函数),因此它仍被引用到某处。
现在,如果你是严格的,你不必担心,因为这是代码在严格模式下的样子:
var looper = (function tempName(someClosureVar)
{
setTimeout((function(resetTimeout)
{
return function()
{
//do stuff, stop OR:
resetTimeout();
};
}(tempName)),1000);
}(document.getElementById('foobar')));
命名函数,就是这样。我为什么不喜欢它? arguments.callee
引发标志,就像一些关闭技巧正在进行的匿名函数一样。我想这只是一种习惯,但我认为,这种习惯可以帮助我更轻松地构建和调试我的代码
结合IE的病态仇恨,这对任何做客户端脚本的人来说都很自然。不支持严格模式的IE版本往往会将函数名称泄漏到全局名称空间,因此永远不会允许与函数关联的内存(以及我们创建的闭包)成为GC'编辑。这可能会导致循环引用,更糟糕的是,循环DOM引用会导致内存泄漏。
实际上:使用arguments.callee
的地方here's another, real example:事件委托和分离事件监听器
here's some more info关于JS严格模式和递归使用arguments.callee
。
最后一个问题,IMO是arguments.callee
如何使用的最明确的例子:递归替换函数:
function someF(foo)
{
//'use strict'; <-- would throw errors here
foo = foo.replace(/(a|b)+/gi, function (p1,p2)
{
if (p1.match(/(a|b){2,}/i))
{
return p1.replace(/(a|b)/gi,arguments.callee);//recursive
}
return (p2.match(/a/i) ? 'X':'Y');
});
}
根据MDN上的请求arguments.callee,警告在严格模式下使用(ECMA 5,这解释了为什么DC说arguments.callee已被弃用)和more on strict
答案 1 :(得分:4)
Calee是ECMAScript 3标准的一部分,因此对于跨浏览器使用应该是安全的。 Callee保存当前正在执行的函数,调用它将调用当前函数。因此callee使用与封闭函数完全相同的参数(或者更确切地说是当前函数)。这里提供了更多信息:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee
使用被叫者被认为是不好的风格。为您提供一个名称,并使用此名称......
答案 2 :(得分:3)
它指定当前正在执行的函数,因此arguments.callee
是当前函数。如果你需要在无穷大的函数中递归,这可能会有所帮助。这里来自mozilla的例子:
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)
答案 3 :(得分:2)
callee是arguments对象的属性。它可用于引用该函数的函数体内当前正在执行的函数。
答案 4 :(得分:1)
arguments.callee是一个关于通过询问“谁在调用这个特定参数?”来了解当前执行函数的方法。 。 。 。
function factorial(a){
if(a>0)
return a*arguments.callee(a-1);
}
此处如果调用factorial(5),它将检查大于0的条件,如果为真,则将为下一个较小的数字执行相同的逻辑。 。 。在某些情况下,您不知道要调用的函数的名称。 。 。 .so你可以使用这个属性
这是一个很好的参考
在ES5中弃用了 arguments.callee()