2013-04-24 37 views
1

我有时看到这种模式使用在javascript中的函数声明中命名函数有什么好处?

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

感谢

+1

可能的重复 http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – MasNotsram 2013-04-24 10:57:00

回答

0

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

如果你想引用当前函数的函数体里面,你需要创建一个命名函数表达。这个名称仅限于函数体(scope)。这也避免了使用非标准的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()

0

我想根本的是,你可以回答一个问题你的问题。这个问题是,如果你不指定函数,你会怎么去明确地在其他地方调用函数呢?

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

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

相关问题