此代码出现在一个非常流行的JS教程中:
const sum = (function() {
"use strict";
return function sum(...args) {
return args.reduce((a, b) => a + b, 0);
};
})();
console.log(sum(1, 2, 3)); // 6
答案 0 :(得分:1)
使用一个像您的示例中那样立即被调用的匿名函数通常是出于隔离代码范围的唯一目的。特别是在这种情况下,"use strict"
的使用将严格模式仅限制为顶级函数中的代码。
如您所说,您可以只具有一个函数,而不是两个,但是结果不一样:
const sum = (function() {
"use strict";
var x = something(); // strict mode enforced here
return function sum(...args) {
return args.reduce((a, b) => a + b, 0);
};
})();
在这里:
var x = something(); // strict mode not enforced here
function sum() {
"use strict";
return arguments.reduce((a, b) => a + b, 0);
};
另外,虽然在第二种方法中必须在全局范围内声明函数,但在第一种方法中,可以在顶级函数中声明许多函数而不会污染全局范围。
答案 1 :(得分:0)
对于数字2的部分回答,一个命名函数将在堆栈跟踪中报告其名称,而分配给变量或常量的匿名函数则不会。因此,这稍微偏向于只声明函数。
但是,您可以命名一个函数并将其分配给变量或常量,而不会出现以下问题:
let sum = function sum(...args) {
return args.reduce((a, b) => a + b, 0)
}
如果您更喜欢分配的功能,则可以为您带来两全其美的体验。
答案 2 :(得分:0)
是您的第一个问题:当使用函数来打包模块并模拟名称空间(或包)作用域时,上面使用的构造才有意义。所有功能最强大的本地var都将自动成为“包”范围。在上面的示例中,没有使用它,所以我也认为它是过度设计的
第二个问题-匿名fn,var和let具有明显不同的可见性。这通常在设计中很重要,可以帮助您更好地控制需要暴露的内容。这是我唯一能想到的原因。答案 3 :(得分:0)