Как делает эту работу синтаксиса JavaScript/jQuery: (функция (окно, неопределенное) {}) (окно)?

Имейте Вас когда-либо смотревший под капотом на исходный код jQuery 1.4 и замеченный, как он инкапсулируется следующим образом:

(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

Я прочитал статью о Пространстве имен JavaScript и другом названном "Важная Пара Parens", таким образом, я знаю некоторых о том, что продолжается здесь.

Но я никогда не видел этот конкретный синтаксис прежде.Что это? undefined выполнение там? И почему делает window потребность, которая будет передана и затем появляется в конце снова?

153
задан halfer 28 May 2019 в 18:26
поделиться

3 ответа

Не определено - это обычная переменная, которую можно просто изменить с помощью undefined = "новое значение"; . Таким образом, jQuery создает локальную «неопределенную» переменную, которая ДЕЙСТВИТЕЛЬНО не определена.

Переменная окна сделана локальной из соображений производительности. Потому что, когда JavaScript ищет переменную, он сначала перебирает локальные переменные, пока не найдет имя переменной. Когда он не найден, JavaScript проходит через следующую область видимости и т. Д., Пока не фильтрует глобальные переменные. Так что, если переменная окна сделана локальной, JavaScript может найти ее быстрее. Дополнительная информация: Ускорьте свой JavaScript - Николас К. Закас

159
ответ дан 23 November 2019 в 22:06
поделиться

Другие объяснили undefined . undefined подобен глобальной переменной, которая может быть переопределена на любое значение. Этот метод предназначен для предотвращения сбоя всех неопределенных проверок, если кто-то где-то написал, скажем, undefined = 10 . Аргумент, который никогда не передается, гарантированно будет действительным undefined независимо от значения переменной undefined .

Причину прохождения окна можно проиллюстрировать на следующем примере.

(function() {
   console.log(window);
   ...
   ...
   ...
   var window = 10;
})();

Что записывает консоль? Значение объекта окно верно? Неправильный! 10? Неправильный! Он регистрирует undefined . Интерпретатор Javascript (или JIT-компилятор) переписывает его следующим образом -

(function() {
   var window; //and every other var in this function

   console.log(window);
   ...
   ...
   ...
   window = 10;

})();

Однако, если вы получите переменную window в качестве аргумента, переменная var отсутствует и, следовательно, никаких сюрпризов.

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

16
ответ дан 23 November 2019 в 22:06
поделиться

window передается таким образом на случай, если кто-то решит переопределить объект окна в IE, я предполагаю то же самое для undefined , на случай, если он каким-то образом переназначен позже.

Верхнее окно в этом сценарии просто называет аргумент «окно», аргумент, который более локален, чем ссылка в глобальном окне , и то, что код внутри этого закрытия будет использовать . Окно в конце на самом деле указывает, что передать для первого аргумента, в данном случае текущее значение window ... надеюсь, вы не облажались окно до того, как это произойдет.

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

(function($) {
  //inside here, $ == jQuery, it was passed as the first argument
})(jQuery);
6
ответ дан 23 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

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