@vetalmatitskiy
testing engineer

Как понять фрагмент кода вида (function(){}()) на js?

Как понять фрагмент кода вида (function(){}())
Доброго дня, уважаемые js-гуру
анализируя api одной из библиотек в примере обнаружил конструкцию вида:

(function(d, s, id){
    op1;
    op2;
   ...
}(document, 'script', 'jssdk'));

подскажите, пожалуйста, что вообще происходит здесь, зачем скобки оборачивают определение функции и что за последовательность в конце "(document, 'script', 'jssdk')"
и вопрос более общего плана, есть ли инструменты которые помогают понять зашифрованные конструкции подобного вида?
  • Вопрос задан
  • 2842 просмотра
Пригласить эксперта
Ответы на вопрос 5
TekVanDo
@TekVanDo
Javascript Developer
(function(){})() - сразу же вызывает функцию, т.е. код эквивалентен:
(function(ss,mm){
    console.log(ss,mm);
})("привет","мир");

function test(ss,mm){
    console.log(ss,mm);
}

test("привет","мир");
Ответ написан
Комментировать
myrslok
@myrslok
Это называется immediately-invoked function expression, смысл в том, что в JavaScript функции создают область видимости, а блоки не создают со всеми вытекающими последствиями. Кстати, если непонятно, что это за последствия, возможно, вам стоит ознакомиться с областями видимости (англ. -- scope) подробнее. Вкратце можно посмотреть по ссылке, но вообще это очень важная тема.
Ответ написан
Если не ошибаюсь, это просто безымянная функция с вызовом. Можно прочитать как
function fx(d, s, id) { ... }
fx(document, 'script', 'jssdk');

Насколько я понимаю, такой приём используется чтобы завернуть переменные в область видимости, так как в js единственная область – функция. Знающие люди, поправьте меня пожалуйста, если не прав :-)
Ответ написан
Комментировать
Oogway
@Oogway
Могу добавить, что скобки оборачивающие функцию нужны для того, чтобы интерпретатор воспринимал ее как выражение, вторая пара скобок это выражение вызова.
(function($) {
  /* code */
} (jQuery))

Можно встретить такую запись:
(function($) {
  /* code */
} )(jQuery)

Или:
!function($) {
  /* code */
}(jQuery)

Ну и другие унарные операторы: ~, +,- если функция ничего не возвращает. Также можно использовать выражение приставания. В качестве параметров обычно передают ссылки на глобальные объекты window, jQuery и др
Ответ написан
@Bhudh
Это не определение функции.
Это функция-выражение с немедленным вызовом.
Последовательность в конце — обычные параметры при вызове.
Инструменты, которые помогают понять, есть. Книги по синтаксису JavaScript, например.
Лучше всего Дугласа Крокфорда и Дэвида Флэнагана.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы