我有时会看到这种模式使用
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;
}
}
由于
答案 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()
。