在JavaScript中给变量赋值时,使用命名函数的目的是什么?
What is the purpose using a named function when assigning to a variable in JavaScript?
我最近在https://github.com/yeoman/generator-webapp:
的源代码中发现了这个模式AppGenerator.prototype.packageJSON = function packageJSON() {
this.template('_package.json', 'package.json');
};
当你打算把它赋值给一个变量或对象属性时,给函数命名为"packageJSON"的目的是什么?在类似的情况下,我总是使用匿名函数。
用于调试。如果使用命名函数,您可以在您喜欢的开发工具的调用堆栈跟踪中看到该名称。否则您将看到anonymous function
.
这被称为命名函数表达式(或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"
正如其他人所说,主要用于调试目的。但不仅如此。例如,您可以依赖这样一个事实:在函数体中,您可以使用您设置的名称访问函数本身。举一个愚蠢的例子:
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
这是因为在函数体中,函数名总是引用它,而不是像第一个例子那样来自另一个作用域。
相关文章:
- Javascript 对象的推荐构造函数是什么?
- JavaScript 中的“ScriptEngine”函数是什么?
- jQuery中的.proxy()函数是什么
- 删除 href 周围的文本的正确 jquery 函数是什么
- 弹出窗口的确切函数是什么
- javascript中的strord函数是什么?
- 访问cookie最可靠的JavaScript函数是什么?
- Node.js中的函数构造函数是什么
- 交叉过滤中的reduceAdd, reduceSum, reducerremove函数是什么?它们应该如何使用?
- 为什么console.trace()的结果以一个“匿名函数”结束?这个函数是什么?
- 数组字面量中的构造函数是什么?
- Javascript中类似php函数substr()的函数是什么?
- 参数中的匿名函数是什么意思?
- 拆分函数是什么样子的?
- jquery中. max()的等效函数是什么?
- 在Node Js中,tcp连接中socket的.on函数是什么?
- firefox浏览器(所有版本)中的.load()等效函数是什么?
- jQuery' width()函数的Javascript等效函数是什么?
- jQuery中的.selectmany()函数是什么?
- setTimeout执行的函数是什么?