嵌套函数通常什么时候适合 JavaScript?

spi*_*kin 5 javascript

我正在通过这个网站学习 JavaScript 。该链接指向我现在正在阅读的特定章节。

在书中,作者讨论了将模块的实现细节保留在本地范围内。他通过以下方式实现了这一目标:

var dayName = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return function(number) {
    return names[number];
  };
}();
Run Code Online (Sandbox Code Playgroud)

我明白这是如何运作的,但我不明白他为什么这样做。他为什么不直接做...

function dayName(number) {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return names[number];
}
Run Code Online (Sandbox Code Playgroud)

...对我来说,这看起来是一个更干净、更易读的代码?考虑到他的目标是保持names在本地范围内,创建嵌套 lambda 似乎是多余的。

在这种情况下使用嵌套函数有什么真正的优势吗?或者他只是将其用于教育目的?

谢谢!

Bar*_*mar 2

您展示的玩具示例不是很引人注目。以这种方式编写的主要优点是数组仅创建一次,而不是每次调用函数时创建。这使得速度更快一点,但代价是保留为整个会话分配的数组(常见的时空权衡)。在实践中,很少有人这样编程。

当您有多个函数并且它们对共享数据进行操作时,该技术会变得更加有用。如果其中一个函数修改了变量,则会在闭包中记住这一点,并且在稍后调用其他函数时对它们可见。

var dayName = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return {
    getDay: function(number) {
        return names[number];
    },
    setDay: function(number, newName) {
        names[number] = newName;
    }
  };
}();
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

console.log(dayName.getDay(3)); // prints "Wednesday"
dayObj.setDay(3, "Mercredi");
console.log(dayName.getDay(3)); // prints "Mercredi"
Run Code Online (Sandbox Code Playgroud)

您无法使用该函数的第二种形式来执行此操作,因为它没有从一次调用到下一次调用的内存。