【发布时间】:2010-07-17 20:46:05
【问题描述】:
我正在阅读 Mozilla 开发人员关于闭包的网站,我在他们的示例中注意到常见错误,他们有以下代码:
<p id="help">Helpful notes will appear here</p>
<p>E-mail: <input type="text" id="email" name="email"></p>
<p>Name: <input type="text" id="name" name="name"></p>
<p>Age: <input type="text" id="age" name="age"></p>
和
function showHelp(help) {
document.getElementById('help').innerHTML = help;
}
function setupHelp() {
var helpText = [
{'id': 'email', 'help': 'Your e-mail address'},
{'id': 'name', 'help': 'Your full name'},
{'id': 'age', 'help': 'Your age (you must be over 16)'}
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = function() {
showHelp(item.help);
}
}
}
他们说对于 onFocus 事件,代码只会显示最后一项的帮助,因为分配给 onFocus 事件的所有匿名函数都有一个围绕“item”变量的闭包,这是有道理的,因为在 JavaScript 变量中没有块范围。解决方案是改用'let item = ...',因为它具有块范围。
但是,我想知道为什么不能在 for 循环上方声明“var item”?然后它具有 setupHelp() 的范围,并且每次迭代都为它分配一个不同的值,然后将其捕获为闭包中的当前值...对吗?
【问题讨论】:
-
javascript 有
let?抬头…… -
@Kobi:它是 Mozilla 特定的 JavaScript 扩展。见this。
-
如果它是 Mozilla 特有的,那是否意味着我应该避免使用它?
-
只有在您能保证您的用户永远不会使用非 Mozilla 浏览器的情况下。所以,实际上,没有。这是功能兼容性的有用参考:robertnyman.com/javascript/index.html
标签: javascript loops closures