Имейте Вас когда-либо смотревший под капотом на исходный код jQuery 1.4 и замеченный, как он инкапсулируется следующим образом:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Я прочитал статью о Пространстве имен JavaScript и другом названном "Важная Пара Parens", таким образом, я знаю некоторых о том, что продолжается здесь.
Но я никогда не видел этот конкретный синтаксис прежде.Что это? undefined
выполнение там? И почему делает window
потребность, которая будет передана и затем появляется в конце снова?
Не определено - это обычная переменная, которую можно просто изменить с помощью undefined = "новое значение";
. Таким образом, jQuery создает локальную «неопределенную» переменную, которая ДЕЙСТВИТЕЛЬНО не определена.
Переменная окна сделана локальной из соображений производительности. Потому что, когда JavaScript ищет переменную, он сначала перебирает локальные переменные, пока не найдет имя переменной. Когда он не найден, JavaScript проходит через следующую область видимости и т. Д., Пока не фильтрует глобальные переменные. Так что, если переменная окна сделана локальной, JavaScript может найти ее быстрее. Дополнительная информация: Ускорьте свой JavaScript - Николас К. Закас
Другие объяснили 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
где-нибудь в своей функции по какой-либо причине, рекомендуется позаимствовать ее из глобальной области видимости.
window
передается таким образом на случай, если кто-то решит переопределить объект окна в IE, я предполагаю то же самое для undefined
, на случай, если он каким-то образом переназначен позже.
Верхнее окно
в этом сценарии просто называет аргумент «окно», аргумент, который более локален, чем ссылка в глобальном окне
, и то, что код внутри этого закрытия будет использовать . Окно
в конце на самом деле указывает, что передать для первого аргумента, в данном случае текущее значение window
... надеюсь, вы не облажались окно
до того, как это произойдет.
Это может быть проще придумать, показав наиболее типичный случай, используемый в jQuery, обработку плагина .noConflict ()
, поэтому для большей части кода вы все еще можете использовать $
, даже если это означает что-то другое кроме jQuery
за пределами этой области:
(function($) {
//inside here, $ == jQuery, it was passed as the first argument
})(jQuery);