Именованная функция самовозбуждения
Есть ли когда-нибудь причина использовать именованную самопризывающую функцию?
Например:
(function foo()
{
alert('Hello World! Named Self Invoking Function Here');
})();
Насколько я понял, это действует так же, как и функция анонимного самовозбуждения, без дополнительных преимуществ (вы не можете вызывать ее снова после вызова) и без дополнительных недостатков, поскольку она не "загрязняет" глобальную систему. сфера (я думаю).
Есть ли случаи, когда было бы целесообразно назвать функцию, вызывающую себя, как указано выше?
5 ответов
Если вам нужна рекурсивная функция, вызывающая себя, то это может иметь смысл:
(function loop(i) {
console.log(i);
i++;
if(i < 10) {
loop(i);
}
})(0);
Я использую этот шаблон для периодического опроса данных с серверов. Это делает код менее беспорядочным (особенно setTimeout
линия).
(function poll() {
$.get("/somedata", function (data) {
// Processing data...
setTimeout(poll, 1000);
});
})();
Это было бы полезно для рекурсии, но вы должны пока избегать выражений именованных функций. Они не поддерживаются корректно в Internet Explorer до версии 9.
Смотрите: http://javascript.info/tutorial/functions-declarations-and-expressions
"IE<9 не поддерживает NFE"
Присвоение имен вызываемым функциям может повысить удобочитаемость. Например, в случае, когда вы создаете несколько замыканий с помощью функций, вызываемых самим собой, предоставляя имена, это увеличивает читабельность кода без вреда (кроме потери поддержки старого IE, как уже было отмечено). По сути, вы создаете именованные блоки кода, что может быть хорошим способом разбить большую функцию.
например,
function bigFunction() {
(function doTheFirstThing() {
//code here.
})();
(function doTheSecondThing() {
//code here.
})();
}
Вы можете использовать его для инициализации, строки кода, которую вы должны сначала запустить, а затем она вызовет другой скрипт.
Это дает нам возможность создавать рекурсивные, самоисполняющиеся функции. В следующей демонстрации я создал самоисполняющуюся функцию, которая увеличивает счетчик, регистрирует его, а затем рекурсивно вызывает себя:
var counter = 0;
// Create a self-executing function block; however, rather
// than passing in an anonymous, headless function, let's
// pass in a named function.
(function useCounter() {
// Increment and log counter.
console.log(++counter);
// Call *this* function again in after a short timeout.
setTimeout(useCounter, 1000);
})(); // Self-execute.
Еще одно более распространенное использование самовызывающихся функций - это конфиденциальность данных, все, что в них заключено, доступно только в рамках этих функций.
Для получения дополнительной информации посетите https://en.wikibooks.org/wiki/JavaScript/Anonymous_functions.