Какая польза от встроенных функций?
Я видел этот код (объяснительно это в jQuery, с модификацией)
(function(window,undefined){
var jQuery=(function(){
var jQuery=something;
jQuery.xxx=xxx;
//...
return jQuery;
})();
//...
window.jQuery=window.$=jQuery;
})(window);
Пока я понимаю, что код упаковки во встроенном вызове функции может четко определять область переменной, я не понимаю преимуществ
- передать
window
с помощью параметра вместо прямого использования,
- получить экземпляр
undefined
с помощью параметра undefined, а также
- определение
jQuery
возвращаемым значением другого встроенного вызова функции.
Может кто-нибудь объяснить немного?
EDIT пишите # 3 более четко:
Я понимаю, что код определяет jQuery
внутри другой функции, а затем возвращает его.
//(function(window,undefined){
var jQuery=(function(){
// Inside this function defines jQuery and return it?
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
return jQuery;
})(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);
Это больше похоже на следующее:
function define_jQuery(){
// Inside this function defines jQuery and return it?
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
return jQuery;
}
//(function(window,undefined){
var jQuery=define_jQuery(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);
Не проще ли это сделать:
//(function(window,undefined){
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
//... })(window);
Ответы
Ответ 1
Отвечая на эти вопросы отдельно:
-
Почему window
прошел? Поскольку разыменование переменной в JavaScript является болезненным. Передача в экземпляре означает, что вам это не нужно. Обычно механизм выглядит следующим образом:
(function (window, document, $) {
}(window, window.document, jQuery));
В этом случае не нужно переходить в глобальную область, чтобы разыменовать любой из этих трех (и jQuery может быть в .noConflict()
для загрузки).
-
Это действительный JavaScript: undefined = 2;
. Я даю, что это очень глупо, но это возможно. Но если вы принимаете еще один аргумент в функции, чем передан, уверен, что это действительно undefined
, а не взломанная его копия.
-
Возврат jQuery из предыдущей функции позволяет цепочку методов: $('#sel').func1().func2()
. Это возможно, потому что func1, вероятно, выглядит примерно так:
jQuery.fn.func1 = function () {
return $(this).each(function () {
// do something fabulous
};
};
return $(this).bla_de_bla()
является короткой для:
$(this).bla_de_bla(..);
return $(this);
Также предполагается, что .bla_de_bla() также возвращает $(this)
EDIT: изменено # 3, чтобы отметить, что это лучше всего при цепочке, а не кругом вокруг .noConflict()
и неверно названном $
.
Ответ 2
Одна из причин заключается в минимизации кода. Minifiers не может сокращать глобальные имена, поскольку они больше не будут ссылаться на глобальный объект. Передавая все объекты, с которыми вы работаете, они становятся локальными. Таким образом, тысячи ссылок на window
и undefined
могут быть уменьшены.
Ответ 3
Передача window
в качестве параметра делает точно bugger all и является пустой тратой пространства: это объект и поэтому передается по ссылке. Любые изменения в window
внутри закрытия будут влиять на тот же экземпляр, что и внешний.
Получение параметра undefined
является контрмерой для всех, кто достаточно глуп, чтобы назвать фактическую переменную undefined
(которую вы не можете делать в новых браузерах)
Насколько я могу судить, эта вторая встроенная функция совершенно бессмысленна, за исключением того, что временные переменные используются в процессе определения свойств jQuery
.
Ответ 4
Прекрасная часть о параметре "window" - это не разыменование. Что делать, если вы переходите в "окно" в один экземпляр и window.parent в другой (подумайте, что дочерние окна управляют родительским элементом для расширенной функциональности, duh!!!).
Если функция hide не вернула объект (#blah), show ничего не смог с этим сделать! Он возвращает #blah в функцию show.
JQuery всегда немного умнее, чем я (и я обычно нахожу скрытые подсказки!).