Как эта практика называется в JavaScript? - PullRequest
57 голосов
/ 15 сентября 2010

Когда вы заключаете свой код JavaScript в функцию, подобную этой:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();

Я заметил, что это устраняет проблемы с областью видимости для меня на многих веб-страницах. Как называется эта практика?

Ответы [ 8 ]

38 голосов
/ 15 сентября 2010

Шаблон называется Самовывоз , Самовозвратная функция . Он может создать замыкание, но это эффект шаблона (возможно, предполагаемый эффект), а не сам шаблон.

20 голосов
/ 15 сентября 2010

Чтобы пояснить некоторые комментарии ниже, в большинстве случаев времени, когда он создает замыкание , он сохраняет ваши переменные в пределах этого локального замыкания, чтобы не создавать глобальные переменные,он поддерживает чистоту и избегает любых возможных нежелательных изменений этих переменных.

Здесь есть несколько превосходных ответов, которые объясняют почему немного больше: Как работает закрытие javascript?

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

Формат })(); в конце, в отличие от });, фактически вызывает это замыкание для немедленного выполнения,без параметров.Если у вас есть что-то, например, })(something);, тогда в качестве первого аргумента здесь будет передано something: (function(somethingParam){.

15 голосов
/ 15 сентября 2010

Функция обёртывания называется анонимной (она не имеет имени и не присваивается переменной). Самоисполняющаяся (она сама выполняется сразу) функция.

Я не помню, чтобы видел точное имя для этого шаблона, но он предотвращает утечку переменной в глобальную область.

12 голосов
/ 27 декабря 2010

Бен Алман представляет интересный аргумент в пользу широко используемой терминологии для этого «шаблона».

Его пост в блоге об этом здесь (http://benalman.com/news/2010/11/immediately-invoked-function-expression/).

Если его сообщение слишком длинное для вас, вот мое резюме (я все еще рекомендую прочитать его, так как это резюме много не учитывается):

Если вы хотите, чтобы именованная функция выполнялась / запускалась самостоятельно, она должна выглядеть следующим образом:

// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}

Если вы хотите, чтобы анонимная функция выполнялась / вызывалась самостоятельно, она должна выглядеть следующим образом:

// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};

Если вы хотите, чтобы анонимная функция была немедленно выполнена / вызвана, она должна выглядеть следующим образом:

// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());

Мои собственные мысли по этому вопросу:

Другие ответы верны; то, о чем вы спрашиваете, обычно называют «вызывающей себя анонимной функцией».
Однако эта терминология не совсем точно отражает то, что на самом деле происходит; «Выражение с немедленным вызовом функции» (сокращенно «iffy») выглядит как более подходящий термин.


Забавные факты, чтобы произвести впечатление на ваших друзей:

Вы также можете создать Iffy:

!function(){
   alert("immediately invoked!");
}();

или

+function(){
   alert("immediately invoked!");
}();

или если вы действительно cRaZy ( пример ):

!1%-+~function(){
   alert("immediately invoked!");
}();

в большинстве браузеров (если не во всех, я не уверен), и эффект будет таким же (Facebook использует версию !).

6 голосов
/ 01 октября 2010

Дуглас Крокфорд и команда YUI называют его шаблон модуля .

3 голосов
/ 20 июля 2014

Как называется эта практика?

Он называется выражением немедленного вызова функции , короче: IIFE. Он определяет функцию в выражении, которая затем выполняется сама по себе (без назначения функции любому идентификатору). Иногда его также называют немедленно исполняемым выражением функции (IEFE).

До того, как Бен Алман написал о них свой пост в блоге, они также были известны как самовывозные (анонимные) функции , термин, который с тех пор стал необычным. Это было технически неточно, намекая на рекурсивный вызов, который на самом деле не происходит.

Подробнее о синтаксисе см. Объяснить синтаксис инкапсулированной анонимной функции и Расположение скобок для автоматического выполнения анонимных функций JavaScript? .

Я заметил, что это устраняет проблемы с областью видимости на многих веб-страницах.

Да, цель этого шаблона - ввести дополнительную область видимости, выполнив функцию.

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

2 голосов
/ 28 декабря 2010

Это было вокруг дольше, чем "шаблоны". Это общая идиома в схеме / lisp, в основном используемая для инкапсуляции, особенно при выполнении метапрограммирования.

0 голосов
/ 14 июня 2017

Версия 1: -

function mySpace()
{
    var obj = {};

    obj.name = "Deepak";
    obj.whoami = function ()
    {
        return obj.name;
    }

    window['myObject'] = obj;
}

mySpace();

myName = myObject.whoami();

console.log(myName);

Версия 2: -

(function(){

    var obj = {};

    obj.name = "Deepak";
    obj.whoami = function ()
    {
        return obj.name;
    }

    window['myObject'] = obj;
})();

myName = myObject.whoami();

console.log(myName);

Мы не вызываем никакую именованную функцию в версии 2 для инициализации myObject, но она доступна для глобальной области видимости.

Вы связываете только <script src="jquery.min.js"></script> и $ объект доступен для использования. Этот стиль известен как функция самостоятельного вызова.

...