命名的主要好处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()在严格模式下使用。