Так что, если функция getHelp () связана с обработчиком события onfocus, и вы даже не фокусируете поля ввода, как может работать функция getHelp () ?? И как JAvaScript хранит все возможные результаты этого маленького цикла?
Это суть вашего вопроса, и ответ лежит здесь:
for(var i=0;i<helpText.length;i++){
var item = helpText[i];
alert(item.help);
// only to show value of "help" at this point, also to prove that "getHelp()" is
// being called even though the onfocus wasn't used
document.getElementById(item.id).onfocus = getHelp(item.help);
}
Это , как интерпретатор JavaScript хранит все возможные результаты: потому что вы сказали ему, что они были. Вы вызываете getHelp
, который генерирует функцию, а затем возвращает эту функцию.
Как это работает, намного проще, чем кажется. :-) Я вхожу в это справедливо здесь , но в основном: Когда вы вызываете функцию, создается нечто, называемое контекст выполнения . Это объект (JavaScript массово объектно-ориентированный, вплоть до уровня интерпретатора). В этом объекте контекста выполнения есть нечто, называемое переменный объект . Он содержит все переменные для контекста выполнения в качестве свойств. Это включает в себя аргументы функции, все var
s внутри функции, а также все объявленные функции (у вас нет объявленных функций в вашем примере, поэтому мы можем игнорировать это; вы есть только функциональные выражения, что нормально). Любая функция, объявленная или определенная выражением в контексте выполнения, имеет постоянную ссылку на объект переменной для этого контекста выполнения и использует ее для разрешения ссылок на переменные при вызове.
Итак: в вашем цикле, когда вы вызываете getHelp
, создается объект, хранящий данные, связанные с этим вызовом. Этот объект привязан к функции, которую вы создаете в вызове и сохраняете в обработчике onfocus
(это данные, которые функция закрывает по [именно поэтому она называется closure )]. Когда / если вызывается обработчик, таким образом разрешаются ссылки, которые содержит функция, на свойства этого объекта.
Подробнее: Затворы не сложны