Какова цель упаковки целых файлов Javascript в анонимные функции, такие как «(function () {…}) ()»?

Попробуйте следующее регулярное выражение:

^Red October$

По умолчанию регулярные выражения чувствительны к регистру. ^ отмечает начало совпадающего текста, а $ - конец.

561
задан Chirag Bhatia - chirag64 5 February 2016 в 15:33
поделиться

5 ответов

Обычно это пространство имен (см. Ниже) и управление видимостью функций-членов и / или переменных. Думайте об этом как об определении объекта. Плагины jQuery обычно пишутся так.

В Javascript вы можете вкладывать функции. Итак, следующее допустимо:

function outerFunction() {
   function innerFunction() {
      // code
   }
}

Теперь вы можете вызвать outerFunction () , но видимость innerFunction () ограничена областью outerFunction () , что означает, что он является частным для outerFunction () . В основном он следует тому же принципу, что и переменные в Javascript:

var globalVariable;

function someFunction() {
   var localVariable;
}

Соответственно:

function globalFunction() {

   var localFunction1 = function() {
       //I'm anonymous! But localFunction1 is a reference to me!
   };

   function localFunction2() {
      //I'm named!
   }
}

В приведенном выше сценарии вы можете вызвать globalFunction () из любого места, но вы не можете вызвать localFunction1 или localFunction2 .

Когда вы пишете (function () {... code ...}) () , вы создаете код внутри функционального литерала (то есть всего " объект "на самом деле является функцией). После этого вы вызываете функцию самостоятельно (последняя () ). Таким образом, основным преимуществом этого, как я уже упоминал ранее, является то, что вы можете иметь частные методы / функции и свойства:

(function() {
   var private_var;

   function private_function() {
     //code
   }
})()

В первом примере globalFunction () была публичной функцией, которую можно было вызвать для доступа к общедоступным функциям, но в приведенный выше пример, как вы это называете? Здесь функция самозапуска заставляет код автоматически запускаться при запуске. Так же, как вы можете добавить initMyStuff (); на вершину любого.js, и он будет автоматически запускаться как часть глобальной области видимости, эта самозапускающаяся функция также будет запускаться автоматически, хотя, поскольку это безымянная функция, ее нельзя вызывать несколько раз, как это может быть initMyStuff ().

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

var myPlugin = (function() {
 var private_var;

 function private_function() {
 }

 return {
    public_function1: function() {
    },
    public_function2: function() {
    }
 }
})()

Теперь вы можете вызвать myPlugin .public_function1 () , но вы не можете получить доступ к private_function () ! Это очень похоже на определение класса. Чтобы лучше понять это, я рекомендую следующие ссылки для дальнейшего чтения:

РЕДАКТИРОВАТЬ

Я забыл упомянуть. В этом последнем () вы можете передать все, что захотите. Например, когда вы создаете плагины jQuery, вы передаете jQuery или $ следующим образом:

(function(jQ) { ... code ... })(jQuery) 

Итак, вы определяете функцию, которая принимает один параметр ( называется jQ , локальной переменной и известна только этой функции). Затем вы вызываете функцию самостоятельно и передаете параметр (также называемый jQuery , но этот относится к внешнему миру и является ссылкой на сам jQuery). В этом нет необходимости, но есть некоторые преимущества:

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

Ранее я описал, как эти функции запускаются автоматически при запуске, но если они запускаются автоматически, кто передает аргументы? Этот метод предполагает, что все параметры определены как глобальные переменные. Поэтому, если jQuery не был определен как глобальная переменная, этот пример не работал бы и не мог бы быть вызван другим способом, поскольку наш пример является анонимной функцией. Как вы могли догадаться, во время инициализации jquery.js определяет глобальную переменную jQuery, а также более известную глобальную переменную $, которая позволяет этому коду работать после включения jquery.js.

777
ответ дан 22 November 2019 в 22:09
поделиться

Это называется закрытием. По сути, он запечатывает код внутри функции, чтобы другие библиотеки не мешали ему. Это похоже на создание пространства имен в скомпилированных языках.

Пример. Предположим, я пишу:

(function() {

    var x = 2;

    // do stuff with x

})();

Теперь другие библиотеки не могут получить доступ к переменной x , которую я создал для использования в моей библиотеке.

19
ответ дан 22 November 2019 в 22:09
поделиться

Javascript в браузере действительно имеет лишь несколько эффективных областей действия: область действия функции и глобальная область действия.

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

26
ответ дан 22 November 2019 в 22:09
поделиться

Вы можете использовать закрытие функций как data в больших выражениях, а также в этом методе определения поддержки браузером некоторых HTML5 объекты.

   navigator.html5={
     canvas: (function(){
      var dc= document.createElement('canvas');
      if(!dc.getContext) return 0;
      var c= dc.getContext('2d');
      return typeof c.fillText== 'function'? 2: 1;
     })(),
     localStorage: (function(){
      return !!window.localStorage;
     })(),
     webworkers: (function(){
      return !!window.Worker;
     })(),
     offline: (function(){
      return !!window.applicationCache;
     })()
    }
8
ответ дан 22 November 2019 в 22:09
поделиться

В дополнение к сохранению переменных локальными, очень удобно использовать при написании библиотеки с использованием глобальной переменной, вы можете дать ей более короткое имя переменной для использования в библиотеке. Он часто используется при написании плагинов jQuery, поскольку jQuery позволяет отключить переменную $, указывающую на jQuery, с помощью jQuery.noConflict (). Если он отключен, ваш код все равно может использовать $ и не сломаться, если вы просто сделаете это:

(function($) { ...code...})(jQuery);
7
ответ дан 22 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

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