【发布时间】:2012-08-09 06:00:33
【问题描述】:
我决定在尝试理解 Javascript 方面向前迈出一步,并再次阅读 Javascript: The Good Parts。这是第一个疑问:
假设我想避免使用全局变量,因为它们是邪恶的,所以我有以下内容:
var digit_name = function(n) {
var names = ['zero','one','two','three'];
return names[n];
}
D.Crockford 声称这是慢,因为每次调用该函数时,都会完成names 的新实例化。所以,然后他通过这样做转移到 closure 解决方案:
var digit_name = function () {
var names = ['zero', 'one', 'two', 'three'];
return function (n) {
return names[n];
}
}();
这使得names 变量存储在内存中,因此每次我们调用digit_name 时它都不会被实例化。
我想知道为什么?当我们调用digit_name 时,为什么第一行被“忽略”了?我错过了什么?这里到底发生了什么?
我不仅基于书中的示例,而且基于video(第 26 分钟)
(如果有人认为更好的标题,请酌情提出......)
【问题讨论】:
-
克罗克福德真的建议这样做吗?哪一页?如果在代码末尾有一个最终的
(),这将更有意义,这意味着digit_name获取外部函数的返回值,即内部函数。 -
我的错误。忘记加();在末尾。对不起,伙计们。
-
“我想避免使用全局变量,因为它们是邪恶的,” - 不,它们不是,就像刀是邪恶的一样 - 这就是你的方式使用它们很重要。 (即便如此,不恰当地使用全局变量是......不恰当的 - 不是邪恶的。)。但在任何情况下,为避免全局变量而开始使用的代码都会立即创建一个全局变量 (
digit_name)。 -
@nnnnnn:我实际上是在引用 D.Crockford,我在两次会议上都听到他这么说 :)
-
是的,克罗克福德先生似乎对一切都视若无睹。我认为灰色地带让他紧张。 (并不是说他没有很多好的建议——问题是要弄清楚哪些建议只是他个人的偏好,表现为“事实”。)
标签: javascript closures