【问题标题】:javascript: how to refer to an anonymous function within the function itself?javascript:如何在函数本身中引用匿名函数?
【发布时间】:2011-08-11 01:52:15
【问题描述】:

如果arguments.callee在“use strict”中是不允许的,我们不能这样做

var f = function g() {
    //g
}

因为在 IE 中不起作用(或“奇怪”地起作用)http://kangax.github.com/nfe/#jscript-bugs,那么我们还有哪些其他选项可以在函数本身中引用匿名函数?

【问题讨论】:

  • 这不是匿名函数。匿名函数没有句柄(例如 f 在您的情况下)
  • @nEEbz:g 使它不是匿名的。表达式 `var f = function() {}`` 中的函数是匿名的。

标签: javascript function anonymous-function scoping


【解决方案1】:

这是一种相当复杂的方法,但它确实有效:

http://jsfiddle.net/4KKFN/4/

var f = function() {
    function f() {
        if (confirm('Keep going?')) {
            this.apply(this);
        }
    }
    f.apply(f);
}

f();

【讨论】:

  • 不能说我实际上会在实际代码中使用这样的东西,但似乎是一个合法的解决方法......
  • 刚刚读到“Y 组合器”(我第一次听说)我意识到,这实际上是一回事。
【解决方案2】:

【讨论】:

  • Y 组合子在这里似乎有点过分了。
  • @Matt Ball:这是解决这个问题的通用解决方案,不仅适用于 JavaScript,也适用于 任何 语言。例如,@jamietre 的解决方案看起来基本上像 Y 组合器的惯用 JavaScript 实现,并应用了一些内联。如果你从未听说过 Y 组合子,我怀疑你自己能想出这样的把戏。
【解决方案3】:

不要使用命名函数表达式。只需按正常方式声明和初始化它。

function f() {
    f();
}

使用 ES5 strict 唯一可行的替代方法是使用您问题中的代码,并处理 IE 糟糕的 NFE 实现。但是:您真的希望 NFE 出现如此严重错误的浏览器(咳咳,IE)很快就会实现"use strict" 吗?

【讨论】:

  • @Matt Ball 我可能弄错了,但我记得在 ES5 严格中不允许函数声明(正常方式),除非它在“全局”范围内..
  • @Pacerier [citation needed]
  • @MattBall iE10 beta 中有 use strict 。它打败了 chrome/safari。
  • @Pacerier: this MDC page 让我觉得你记错了。
  • @Pacerier:全局或函数代码中允许函数声明,但块内不允许。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多