Как работает этот синтаксис JavaScript/JQuery:(function(window, undefined){})(window)?



замыкание javascript (4)

Протестировано с 1000000 итерациями. Такая локализация не влияла на производительность. Даже ни одна миллисекунда в 1000000 итераций. Это просто бесполезно.

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

(function( window, undefined ) {

  //All the JQuery code here 
  ...

})(window);

Я прочитал статью о JavaScript Namespacing и еще одну, которая называется « Важная пара Parens », поэтому я знаю немного о том, что происходит здесь.

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


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

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

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

(function($) {
  //inside here, $ == jQuery, it was passed as the first argument
})(jQuery);

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

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


Неопределенный

Объявляя undefined как аргумент, но никогда не передавая ему значение, он гарантирует, что он всегда неопределен, так как это просто переменная в глобальной области, которая может быть перезаписана. Это делает a === undefined безопасную альтернативу typeof a == 'undefined' , которая сохраняет несколько символов. Это также делает код более дружественным к minifier, так как undefined может быть сокращен до u например, сохраняя еще несколько символов.

Окно

Передача window в качестве аргумента хранит копию в локальной области, что влияет на производительность: http://jsperf.com/short-scope . Все обращения к window теперь будут перемещаться на один уровень за пределы области действия. Как и в случае undefined , локальная копия снова позволяет более агрессивную оценку.

Примечание:

Хотя это, возможно, и не было целью разработчиков jQuery, прохождение в window позволяет более легко интегрировать библиотеку в средах Javascript на стороне сервера, например node.js - там, где нет глобального объекта window . В такой ситуации нужно заменить только одну строку, чтобы заменить объект window другим. В случае jQuery объект-макет window может быть создан и передан с целью очистки HTML (такая библиотека, как jsdom может сделать это).





syntax