繁体   English   中英

Javascript arguments.callee它的用途是什么

[英]Javascript arguments.callee what is it for

我还没有找到这个变量的任何完整的跨浏览器文档。

arguments.callee是什么? 它是如何工作的?

它有哪些论据?

arguments.callee是对当前正在调用的函数的引用。 首先要做的事情是:不要使用它:如果你处于严格的环境中,它只会出现错误。

但是,亲自 - 而且我并不孤单 - 我会想念这家酒店。 在我解释原因之前,我会给你一个伪示例,说明何时使用它:

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 实例 :事件委托和分离事件监听器
这里有一些关于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已被弃用)
而且更严格

Calee是ECMAScript 3标准的一部分,因此对于跨浏览器使用应该是安全的。 Callee保存当前正在执行的函数,调用它将调用当前函数。 因此callee使用与封闭函数完全相同的参数(或者更确切地说它当前函数)。 有关更多信息,请访问: https//developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

使用被叫者被认为是不好的风格。 为您提供一个名称,并使用此名称...

它指定当前正在执行的函数,因此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)

callee是arguments对象的属性。 它可用于引用该函数的函数体内当前正在执行的函数。

MDN在这里提供文档

arguments.callee是一个关于通过询问“谁在调用这个特定参数?”来了解当前执行函数的方法。

 function factorial(a){
    if(a>0)
      return a*arguments.callee(a-1);
 }

这里,如果你调用factorial(5),它将检查大于0的条件,如果为真,则将为下一个较小的数字执行相同的逻辑。 在某些情况下,您不知道要调用的函数的名称。 .so你可以使用这个属性

这是一个很好的参考

来自MDN的arguments.callee

更新:在ES5中不推荐使用arguments.callee()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM