在JavaScript中分配变量时使用命名函数的目的是什么?

时间:2013-04-12 20:50:15

标签: javascript

我最近在https://github.com/yeoman/generator-webapp的来源中遇到了这种模式:

AppGenerator.prototype.packageJSON = function packageJSON() {
  this.template('_package.json', 'package.json');
};

当你要将函数分配给变量或对象属性时,为函数命名为“packageJSON”的目的是什么?我总是在类似情况下使用匿名函数。

3 个答案:

答案 0 :(得分:6)

用于调试目的。如果使用命名函数,则可以在最喜欢的开发工具中的调用堆栈跟踪中看到该名称。否则你会看到anonymous function

答案 1 :(得分:0)

这称为named function expression(或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"

答案 2 :(得分:0)

正如其他人所说,主要用于调试目的。但不仅如此。例如,您可以依赖以下事实:在函数体中,您可以使用您设置的名称访问函数本身。举一个愚蠢的例子:

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

那是因为在函数体中,函数的名称总是引用它,而不是从第一个例子中取自另一个范围。