在javascript中命名函数声明中的函数有什么好处?

时间:2013-04-24 10:49:20

标签: javascript javascript-objects

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

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;
    }
}

由于

2 个答案:

答案 0 :(得分:0)

我想从根本上说,你可以用一个问题回答你的问题。那个问题是,如果你没有命名这个函数你将如何在其他地方明确地调用函数?

当然,您提供的示例仍然可以在没有名称的情况下工作,所以我建议开发人员的个人偏好与任何功能都有关。我个人喜欢将我的函数命名为更容易的调试,重用和可读性,以及明确调用它们的用处。

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

答案 1 :(得分:0)

命名function的主要好处是允许它self-referential,特别是对于递归:

  

如果要引用函数体内的当前函数,则需要创建一个命名函数表达式。这个名称只对函数体(范围)是本地的。这也避免了使用非标准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(),只需为每个函数(表达式)命名。

     

警告:第5版ECMAScript禁止在strict mode中使用arguments.callee()