Столкнулся в этом примере с синтаксисом, который раньше не встречал: for (var state in aus) { ... (function (st, state) { ... })(aus[state], state); } Что означает эта конструкция внутри цикла?
Ответ
Чтобы избежать недостоверных данных, которых в данном треде достаточно, вставлю и свои пять копеек:
на подобный вопрос я уже отвечал - Проблема с обработчиками в цикле, только там подобный синтаксис был решением проблемы
собственно, что это IIFE - Immediately-Invoked Function Expression, и для чего её можно применять уже описано здесь же, но почему этот подоход используется именно в скрипте из ссылки:
for (var state in aus) {
...
(function(st, state) {
st[0].onmouseover = function() {
/* мы знаем, что функция onmouseover - асинхронная, т.е. мы не можем достоверно сказать когда она выполнится, но точно после выполнения цикла, следоватльно, после выполнения цикла aus[state] - будет указывать на последнее значение, которые было получено в цикле, что не соответсвует нашим ожиданиям, для этого aus[state] копируется в переменную st, которая на каждой итерации цикла указывает на необходимый aus[state], тоже самое с переменной state*/
...
};
st[0].onmouseout = function() {
/*здесь ситуация аналогичная*/
...
}
})(aus[state], state);
}
поэтому всегда, когда в цикле оперируем с асинхронными функциями, будь то таймауты, обработчики событий или колбэки, всегда искользуется подобная техника
Тонкости ECMA-262-3. Часть 6. Замыкания.
Комментариев нет:
Отправить комментарий