我最近在https://github.com/yeoman/generator-webapp的源代码中遇到了这种模式:
AppGenerator.prototype.packageJSON = function packageJSON() {
this.template('_package.json', 'package.json');
};
无论如何,当您要将函数分配给变量或对象属性时,将其命名为“packageJSON”的目的是什么?在类似的情况下,我总是使用匿名函数。
我最近在https://github.com/yeoman/generator-webapp的源代码中遇到了这种模式:
AppGenerator.prototype.packageJSON = function packageJSON() {
this.template('_package.json', 'package.json');
};
无论如何,当您要将函数分配给变量或对象属性时,将其命名为“packageJSON”的目的是什么?在类似的情况下,我总是使用匿名函数。
用于调试目的。如果您使用命名函数,您可以在您最喜欢的开发工具的调用堆栈跟踪中看到该名称。否则你会看到anonymous function
.
正如其他人所说,主要用于调试目的。但不仅如此。例如,您可以依赖这样一个事实,即在函数体中,您可以使用您设置的名称访问函数本身。举一个愚蠢的例子:
var sum = function (a, b) {
if (a < 3)
return sum(3 + a, b);
return a + b;
}
sum(1, 2) // 3;
但是让我们看看现在会发生什么:
var aSum = sum;
sum = null;
aSum(1, 3); // TypeError: sum is not a function
命名函数,将涵盖该用例:
var sum = function sum(a, b) {
if (a < 3)
return sum(3 + a, b);
return a + b;
}
sum(1, 2) // 6
var aSum = sum;
sum = null;
aSum(1, 2) // 6
这是因为在函数体中,函数的名称总是引用它,而不是像第一个示例那样取自另一个范围。
这称为命名函数表达式(或 NFE),它使调试过程更加容易。
要记住的一个重要细节是该名称仅在新定义的函数范围内可用;规范要求标识符不应该对封闭范围可用:
var f = function foo(){
return typeof foo; // "foo" is available in this inner scope
};
// `foo` is never visible "outside"
typeof foo; // "undefined"
f(); // "function"