1

我有时会看到这种模式被使用

function foo() {
    this.bar = function bar() {
        // code
    }
}

命名函数而不是将其作为匿名函数的好处/原因是什么?

为了进一步说明/澄清:

function foo() {
    this.bar = function bar() {
        bar.someVar = 1;
    }
}

VS

function foo() {
    this.bar = function() {
        this.someVar = 1;
    }
}

谢谢

4

2 回答 2

0

我想从根本上说,你可以用一个问题来回答你的问题。那个问题是,如果您不命名该函数,您将如何在其他地方显式调用该函数?

当然,您提供的示例仍然可以在没有名称的情况下使用,因此我建议它与开发人员的个人偏好有关,因为它与任何功能有关。我个人喜欢为我的函数命名,以便于调试、重用和可读性,以及显式调用它们的有用性。

通过创建一次函数并重用它们,还可以获得明显的性能优势。

于 2013-04-24T10:55:47.673 回答
0

命名的主要好处function是允许它是自引用的,特别是对于递归:

如果要在函数体内引用当前函数,则需要创建一个命名函数表达式。该名称仅对函数体(作用域)是本地的。这也避免了使用非标准arguments.callee属性。

var math = {
  'factorial': function factorial(n) {
    if (n <= 1)
      return 1;
    return n * factorial(n - 1);
  }
};

也就是说,它不必知道它的持有对象和引用属性名称,这可以改变:

// a contrived and hopefully unrealistic example

function foo() {
    this.bar = function () {
        return this.bar;
    };
}

console.log(new foo().bar());        // Function
console.log(new foo().bar.call({})); // undefined, `{}` doesn't have a `bar`

如前所述,它是部分“取缔”的可用解决方案arguments.callee

注意:您应该避免使用arguments.callee()并且只给每个函数(表达式)一个名称。

警告:ECMAScript 第 5 版禁止arguments.callee()严格模式下使用。

于 2013-04-24T11:24:56.220 回答