Самовызывающиеся функции в Javascript

| Суббота, 26 июля, 2014

Метки: Javascript Комментарии: 16

Javascript кажется немного странным языком, который иногда делает странные вещи. Такие мысли могут возникнуть, если не следить за лучшими практиками и не быть знакомым со стандартом ECMA. Странности встречаются и в синтаксисе и семантике. Одна из таких вещей – это самовызывающиеся функции (self-invoking functions).

Cинтаксис:

(function () {
    // код функции 
 }());

Главной идеей является то, что анонимная функция вызывается сразу после своего объявления. Преимущество от использования самовызывающихся функций вы получите, если нужно выполнить код один раз и сохранить его резульататы во "внешней среде" (без объявления глобальных переменных).

Например, для небольшой веб-страницы можно написать обработчики событий для элементов на странице. Самовызывающиеся функции подходящее средство для такой ситуации.

Что фактически будет происходить?

Как видно из примера выше, мы определили анонимную функцию и нет никаких глобальных переменных. И даже нет локальных, за исключением тех, что мы будем использовать внутри функции. Мы не храним нигде ссылку на эту функцию. Нигде не храним возвращаемое значение. Так только функция инициализирована, она тут же вызывается.

Это может быть удобным вариантом инициализации, например, мы инициализируем и прикрепляем функции обработчиков событий один раз, после объявления функции вызываем ее, и теряем с ней связь.

Существует несколько видов синтаксиса этих функций. Хотя разница очень мала, но приведем примеры. Дуглас Крокфорд, один из разработчиков Javascript, считает правильной такую запись самовызывающейся функции:

(function () {
    //body
}());

А вот другой вариант, который Крокфорд, называет "собачьи яйца" (dog balls).

(function () {
    //body
})();

Некоторые считают, что второй вариант более удобен.

Такой вариант тоже работает, но почему-то нигде не встречается:

function () {
    //body
}();

В самовызывающуюся функцию можно передавать параметры. Это общая практика передачи ссылок на глобальные объекты:

(function (w, d, $) {
   //body
}(window, document, jQuery));

Не рекомендуется передавать слишком много аргументов (больше трех-четырех), потому что если функция становится больше в размерах, то нужно постоянно скроллить, чтобы вспомнить нужный параметр, а если их много то это приходится делать довольно часто. Если вы легко запоминаете аргументы, то нужно быть благосклонным к тем, кто будет читать код после вас.

И самое интересное, ради чего и замыслился весь этот пост, самовызывающуюся функцию можно использовать в модульном паттерне (module pattern). Мы сохраняем ссылку на возвращаемое значение, а именно на API модуля:

var module = (function () {
    //private
    return {
    //public
    }
}());

Статей про модульный паттерн существует очень много, очень удобная штука для тех, кто писал классы в C#, С++ т.п.

Итак, самовызывающиеся функции – это функции, вызывающие сами себя, использовать их или нет зависит от вас, но понимать их надо. Иногда их еще называют как немедленно исполняемые функции (Immediately Invoked Functions).

Комментарии
Алексей
Замыкания это не логическая бага, а ФИЧА! Терь я понял, как работает современное IT - так же как и всегда и везде через одно место..
6 лет назад
Аноним
И всегда будут находиться те, кто всегда не доволен, чем то.... Да,
Алексей?
5 лет назад
Алексей
Да, Аноним
4 года назад
Маньяк
Долой неоптимальность!
Только машинные коды, только совершенство!
4 года назад
Shinto
Если ты не можешь понять для чего нужна самовызывающаяся функция, то зачем так язвительно её комментировать?
Это всё равно если бы я не знала, для чего нужны нейросети и говорила, что это кучка цифр, которая ни на что не способна, максимум 2 + 2 посчитать
4 года назад
dron
`Такой вариант тоже работает, но почему-то нигде не встречается:`
где же он работает???
http://prntscr.com/vjh04n
4 года назад
Сергей
ВЫ ОБА НИЧЕ НЕ ПОНИМАЕТЕ ЧИТАТЬ НАДО КНИЖКИ А НЕ СМОТРЕТЬ ВИДЕО НА ЮТУБЕ
4 года назад
Аноним2, потому что Аноним уже есть
Сергей, аминь
4 года назад
(() => {alert(isset(new_info))})();
4 года назад
facepalm
eb**'
3 года назад
Алексей
НИЧЕ НЕ ЮТУБ, А ЮТЬЮБ
3 года назад
Никто
Норм коменты! lol
2 года назад
Аноним3,потомуАнонимИАноним2ужеЕсть
Да а что вы хотели языки программирования не идеальны в них есть много чего полезного но и касяки тоже имеются ;)
2 года назад
Аноним4,потому что Аноним Аноним2 Аноним3 уже есть
Абсолютно согласен с Аноним3. JS сегодня это результат долгих споров и изменений. Имеем то, что имеем.
2 года назад
Аноним5,потому что Аноним Аноним2 Аноним3 Аноним4 уже есть
alert("Hello, World!");
2 года назад
просто скажу
Спасибо за автору за краткость и полезный материал, а комментаторам за комментарии. Восторг :)
год назад
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2024 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля