Я читаю сайт разработчика 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 =...', потому что тогда у него есть область видимости блока.
Однако, что мне интересно, почему вы не могли объявить "элемент var" прямо над циклом for? Затем он имеет область setupHelp(), и каждая итерация присваивает ему другое значение, которое затем будет записано в качестве текущего значения в закрытии... правильно?