Подтвердить что ты не робот

Какая польза от встроенных функций?

Я видел этот код (объяснительно это в 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);
4b9b3361

Ответ 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!!!).

  • описанный выше.

  • Я еще не совсем уверен.

  • Цепной!!! ex: $('# blah'). hide(). show();

Если функция hide не вернула объект (#blah), show ничего не смог с этим сделать! Он возвращает #blah в функцию show.

JQuery всегда немного умнее, чем я (и я обычно нахожу скрытые подсказки!).