JavaScript函数声明或表达式与返回嵌套函数结合使用

11 浏览
0 Comments

JavaScript函数声明或表达式与返回嵌套函数结合使用

这段代码出现在一个非常流行的JS教程中:\n

const sum = (function() {
  "use strict";
  return function sum(...args) {
    return args.reduce((a, b) => a + b, 0);
  };
})();
console.log(sum(1, 2, 3)); // 6

\n

    \n

  1. 我试图理解他们为什么要从一个函数中返回一个函数(很不幸,那里没有提供解释)。如果外部函数以参数声明,执行计算,然后简单地返回值,那将更简单直接。为什么有必要以这种方式表达一个函数(在这种情况下;在这里可以找到对一般情况的答案:here)?
  2. \n

  3. 是否有理由以表达一个函数而不是声明一个函数?即,将一个函数表达为varletconst而不是仅仅使用function关键字进行声明?每种方式的优点是什么?我在here读到除了提升之外,这完全是一个风格上的决定。那么,总是声明函数而不是表达函数是否更安全?我肯定在这里漏掉了一些基本的东西。
  4. \n

0
0 Comments

从上述内容可以整理出以下问题的原因和解决方法:

问题1:为什么在JavaScript中会使用函数声明或表达式与返回嵌套函数结合的方式?

原因:这种方式在将函数用作模块的封装和模拟命名空间(或包)作用域时是有意义的。所有顶级函数的局部变量都会自动具有“包”作用域。但在上面的示例中没有使用这种方式,因此我认为这种方式是过度设计的。

解决方法:根据实际需求,可以选择使用函数声明或表达式与返回嵌套函数结合的方式。

问题2:为什么匿名函数、var和let具有明显不同的可见性?

原因:在设计中,匿名函数、var和let具有不同的可见性,这通常对于更好地控制需要暴露的内容很重要。这是我能想到的唯一原因。

解决方法:根据设计需求,根据不同的可见性需求,选择适当的方式来声明变量。

0
0 Comments

JavaScript中的函数可以通过声明或表达式来定义,并且可以返回一个嵌套的函数。关于这个问题产生的原因和解决方法,我们可以从以下内容中找出答案。

首先,对于第二个问题的部分回答,一个命名函数会在堆栈跟踪中报告其名称,而赋给变量或常量的匿名函数则不会。因此,这在某种程度上更有利于只声明函数。

然而,你可以给函数命名并将其赋给变量或常量,而不会遇到任何问题,如下所示:

let sum = function sum(...args) {
  return args.reduce((a, b) => a + b, 0)
}

如果你更喜欢赋值函数,这样可以让你兼得两者的优势。

通过以上内容,我们可以得出以下结论:

- 在堆栈跟踪中显示函数名称对于调试非常有用,因此如果你需要在堆栈跟踪中看到函数名称,最好使用声明函数。

- 如果你更喜欢使用赋值函数,你可以通过给函数命名并将其赋给变量或常量来实现。

希望以上内容能够对你理解JavaScript函数声明和表达式以及返回嵌套函数的问题有所帮助。

0
0 Comments

在JavaScript中,我们经常使用立即调用的匿名函数来隔离代码的作用域。在这种情况下,特别是在使用"use strict"严格模式时,该函数的作用域仅限于顶层函数内的代码。

通过上述代码示例,可以看到使用立即调用的匿名函数的主要目的是限制"use strict"严格模式仅适用于顶层函数内的代码。

如果仅仅使用一个函数而不是两个函数,结果将不同。在第一个例子中,我们通过立即调用的匿名函数创建了一个函数,其中包含了"use strict"严格模式,并且在返回的嵌套函数内使用了这个模式。而在第二个例子中,我们直接在全局作用域中声明了一个函数,并在函数内部使用"use strict"严格模式。需要注意的是,第二种方法中的函数必须在全局作用域中声明,而第一种方法可以在顶层函数内声明多个函数,而不会污染全局作用域。

通过使用立即调用的匿名函数,我们可以更好地控制代码的作用域,避免污染全局作用域,并且可以灵活地使用"use strict"严格模式。

0