首页 > 解决方案 > 结合返回嵌套函数的 JavaScript 函数声明或表达式

问题描述

这段代码出现在一个非常流行的 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
  1. 我试图理解他们从函数返回函数的原因(不幸的是,那里没有提供解释)。如果使用参数声明外部函数,执行计算,然后简单地返回值,那将更简单直接。为什么有必要(在这种情况下;似乎可以在此处找到一般情况的答案)以这种方式表达函数?

  2. 有什么理由表达一个函数而不是声明它?即,将函数表示为 a varlet或者const不是简单地用function关键字声明它?每种方式的优点是什么?我在这里读到,除了提升之外,这完全是一个风格决定。那么,总是声明函数而不是表达函数不是更安全吗?我必须在这里遗漏一些基本的东西。

标签: javascriptfunctionecmascript-6declaration

解决方案


使用像您的示例中那样立即调用的匿名函数通常仅出于隔离代码范围的目的。特别是在这种情况下,使用"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);
};

此外,虽然在第二种方法中,函数必须在全局范围内声明,但在第一种方法中,您可以在顶级函数中声明许多函数,而不会污染全局范围。


推荐阅读