Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结合返回嵌套函数的JavaScript函数声明或表达式_Javascript_Function_Ecmascript 6_Declaration - Fatal编程技术网

结合返回嵌套函数的JavaScript函数声明或表达式

结合返回嵌套函数的JavaScript函数声明或表达式,javascript,function,ecmascript-6,declaration,Javascript,Function,Ecmascript 6,Declaration,这段代码出现在非常流行的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 我试图弄清楚它们从函数返回函数的原因(遗憾的是,这里没有提供解释)。如果使用参数声明外部函数,执行计算,然后简单地返回值,则会更简

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

  • 有什么理由表达一个函数而不是声明它吗?i、 e,将函数表示为
    var
    let
    const
    而不是简单地用
    函数
    关键字声明它?每种方式的优点是什么?我读到,除了吊装,这完全是一个风格上的决定。那么,总是声明函数而不是表达函数不是更安全吗?我一定错过了一些基本的东西


  • 使用像您的示例中那样立即调用的匿名函数通常只是为了隔离代码的作用域。特别是在这种情况下,使用
    “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);
    };
    

    此外,在第二种方法中,函数必须在全局作用域上声明,而在第一种方法中,您可以在顶级作用域内声明许多函数,而不会污染全局作用域。

    在对数字2的部分回答中,命名函数将在堆栈跟踪上报告其名称,而分配给变量或常量的匿名函数则不会。所以,这有点倾向于只声明函数

    但是,您可以命名函数并将其分配给变量或常量,而不会出现如下问题:

    let sum=函数和(…args){
    返回参数reduce((a,b)=>a+b,0)
    }
    

    如果您更喜欢指定函数,它可以让您两全其美。

    关于您的第一个问题:当函数用于打包模块和模拟命名空间(或打包)范围时,上面使用的构造是有意义的。所有顶级函数本地变量都将自动“包”作用域。在上面的例子中,这是没有使用,所以我也认为这是过度工程


    关于第二个问题——匿名fn、var和let的可见性有显著不同。这在设计中很重要,可以帮助你更好地控制你需要的东西。这是我能想到的唯一原因。

    1-这就是所谓的“一个”。立即调用的函数表达式。它有几个优点:首先,它是一种创建类似OOP的功能的方法,比如私有函数和公共函数,然后它是一种封装东西的方法,这样它们就不会污染全局名称空间。如果您声明了一个全局函数,并且您使用的某个库具有相同的函数名,会发生什么情况?最后一个赢了,这就产生了难以发现的bug。这也是创建模块的一种方法(阅读更多关于模块的信息)


    2-取决于代码作者使用的逻辑和事物的组织方式。使用变量而不是函数更简洁。在数组函数出现之后,这种情况变得越来越普遍。但这仍然是你的选择。

    似乎只有将严格模式应用于内部函数时才需要使用IIFE包装,这可能是重复的。@AndrewL,谢谢。我更新了问题,使之适用于一般情况。我认为在具体的例子中这样做有什么好处?听起来像是一个糟糕的教程,tbh。除非你考虑严格的模式,否则没有好处。code>const sum=(…xs)=>xs.reduce((a,b)=>a+b,0)确实是您所需要的一切。@最后面的部分当然不是必需的,它们可能只是将指令放在内部函数中。