我讀上關閉Mozilla的開發者的網站,我在他們的常見錯誤例如注意到,他們有這樣的代碼:的Javascript關閉 - 變量的作用域問題
<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 has'let'?查找... – Kobi 2010-07-17 20:50:30
@Kobi:這是一個Mozilla特定的JavaScript擴展。見[this](https://developer.mozilla.org/en/new_in_javascript_1.7)。 – 2010-07-17 21:06:52
如果它是Mozilla特有的,這是否意味着我應該避免使用它? – Nick 2010-07-17 22:45:59