Вы когда-нибудь заглядывали изнутри в исходный код jQuery 1.4 и замечали, как он инкапсулируется следующим образом:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Я прочитал статью о пространстве имен JavaScript и еще одну статью под названием « Важная пара паренов », поэтому я кое-что знаю о том, что здесь происходит.
Но я никогда не видел этот синтаксис раньше. Что это undefined
делает там? И почему window
нужно пройти, а потом снова появиться в конце?
javascript
jquery
syntax
dkinzer
источник
источник
Ответы:
Undefined является нормальной переменной и может быть изменен просто с помощью
undefined = "new value";
. Таким образом, jQuery создает локальную «неопределенную» переменную, которая ДЕЙСТВИТЕЛЬНО не определена.Переменная окна сделана локальной из соображений производительности. Потому что, когда JavaScript ищет переменную, он сначала просматривает локальные переменные, пока не найдет имя переменной. Когда он не найден, JavaScript проходит через следующую область и т. Д., Пока не отфильтрует глобальные переменные. Так что, если переменная окна сделана локальной, JavaScript сможет быстрее ее найти. Дополнительная информация: ускорение JavaScript - Николас С. Закас
источник
Неопределенный
Объявление
undefined
в качестве аргумента, но никогда не передача ему значения гарантирует, что оно всегда неопределено, поскольку это просто переменная в глобальной области видимости, которую можно перезаписать. Это делаетa === undefined
безопасную альтернативуtypeof a == 'undefined'
, которая сохраняет несколько символов. Это также делает код более удобным для минификаторов, чтоundefined
можно сократить,u
например, сохранив еще несколько символов.Окно
Передача
window
в качестве аргумента сохраняет копию в локальной области, что влияет на производительность: http://jsperf.com/short-scope . Все доступыwindow
теперь должны проходить на один уровень меньше по цепочке областей действия. Как и в случаеundefined
, локальная копия снова позволяет более агрессивно минимизировать.Примечание:
Хотя это, возможно, и не было целью разработчиков jQuery, передача
window
позволяет легче интегрировать библиотеку в серверные среды Javascript, например, node.js, где нет глобальногоwindow
объекта. В такой ситуации необходимо изменить только одну строку, чтобы заменитьwindow
объект другой. В случае jQuery, фиктивныйwindow
объект может быть создан и передан с целью очистки HTML (библиотека, такая как jsdom, может сделать это).источник
(function(a,b){})(window);
-a
иb
намного корочеwindow
иundefined
:)Другие объяснили
undefined
.undefined
это как глобальная переменная, которая может быть переопределена на любое значение. Этот метод заключается в предотвращении взлома всех неопределенных проверок, если кто-то что-то написалundefined = 10
. Аргумент, который никогда не передается, гарантированно будет действительнымundefined
независимо от значения переменнойundefined
.Причина прохождения окна может быть проиллюстрирована на следующем примере.
Что записывает консоль? Значение
window
объекта верно? Неправильно! 10? Неправильно! Это логиundefined
. Интерпретатор Javascript (или JIT-компилятор) переписывает его таким образом -Однако, если вы получите
window
переменную в качестве аргумента, нет переменной var и, следовательно, никаких сюрпризов.Я не знаю, делает ли это jQuery, но если
window
по какой-либо причине вы переопределяете локальную переменную где-либо в вашей функции, было бы неплохо позаимствовать ее из глобальной области видимости.источник
window
передается таким образом на тот случай, если кто-то решит переопределить объект окна в IE, я предполагаю то же самое дляundefined
случая, если он будет переназначен каким-то образом позже.Верхняя часть
window
этого скрипта просто называет аргумент «окно», более локальный аргумент, чем глобальнаяwindow
ссылка, и то, что будет использовать код внутри этого замыкания. Вwindow
конце фактически указывается, что передать первому аргументу, в данном случае текущее значениеwindow
... надеюсь, вы не облажались доwindow
того, как это произойдет.Об этом может быть проще подумать, показывая наиболее типичный случай, используемый в jQuery,
.noConflict()
обработку плагинов , поэтому для большей части кода вы все еще можете использовать$
, даже если это означает что-то иное, чемjQuery
за пределами этой области:источник
Протестировано с 1000000 итераций. Этот вид локализации не повлиял на производительность. Ни одной миллисекунды за 1000000 итераций. Это просто бесполезно.
источник
window
вы могли бы увидеть некоторую выгоду от локальной копии.