Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

Что в Javascript значит синтакс ( function(){…} )( param1, param2); ?

Столкнулся в этом примере с синтаксисом, который раньше не встречал: 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. Замыкания.

Комментариев нет:

Отправить комментарий