我正在通过这个网站学习 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 似乎是多余的。
在这种情况下使用嵌套函数有什么真正的优势吗?或者他只是将其用于教育目的?
谢谢!
您展示的玩具示例不是很引人注目。以这种方式编写的主要优点是数组仅创建一次,而不是每次调用函数时创建。这使得速度更快一点,但代价是保留为整个会话分配的数组(常见的时空权衡)。在实践中,很少有人这样编程。
当您有多个函数并且它们对共享数据进行操作时,该技术会变得更加有用。如果其中一个函数修改了变量,则会在闭包中记住这一点,并且在稍后调用其他函数时对它们可见。
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)
您无法使用该函数的第二种形式来执行此操作,因为它没有从一次调用到下一次调用的内存。