Использование «окна», «документа» и «неопределенного» в качестве аргументов в анонимной функции, которая оборачивает плагин jQuery

Честно говоря, я не знал, как сделать название короче.

Я узнал, как написать плагин JQuery, изучая источникSlidesJS плагин. Когда я столкнулся с чем-то новым, я просто спросил моего хорошего другаGoogle и в большинстве случаев получил удовлетворительный ответ. Честно говоря, я никогда не прилагал особых усилий. Я знаю только то, что$ это (вероятно) сокращенный конструктор объекта jQuery и что$() а такжеjQuery() это то же самое, если JQuery включен.

Недавно, однако, я попытался понять науку, стоящую за jQuery и как написатьхороший Плагин jQuery. Я наткнулся на очень хорошийстатья в котором автор перечислил несколькошаблоны для создания плагина jQuery. Поскольку остальные были слишком сложны для понимания, мне понравился первый:Облегченное начало, Теперь вот код для указанного шаблона.

/*!
 * jQuery lightweight plugin boilerplate
 * Original author: @ajpiano
 * Further changes, comments: @addyosmani
 * Licensed under the MIT license
 */


// the semi-colon before the function invocation is a safety 
// net against concatenated scripts and/or other plugins 
// that are not closed properly.
;(function ( $, window, document, undefined ) {

    // undefined is used here as the undefined global 
    // variable in ECMAScript 3 and is mutable (i.e. it can 
    // be changed by someone else). undefined isn't really 
    // being passed in so we can ensure that its value is 
    // truly undefined. In ES5, undefined can no longer be 
    // modified.

    // window and document are passed through as local 
    // variables rather than as globals, because this (slightly) 
    // quickens the resolution process and can be more 
    // efficiently minified (especially when both are 
    // regularly referenced in your plugin).

    // Create the defaults once
    var pluginName = 'defaultPluginName',
        defaults = {
            propertyName: "value"
        };

    // The actual plugin constructor
    function Plugin( element, options ) {
        this.element = element;

        // jQuery has an extend method that merges the 
        // contents of two or more objects, storing the 
        // result in the first object. The first object 
        // is generally empty because we don't want to alter 
        // the default options for future instances of the plugin
        this.options = $.extend( {}, defaults, options) ;

        this._defaults = defaults;
        this._name = pluginName;

        this.init();
    }

    Plugin.prototype.init = function () {
        // Place initialization logic here
        // You already have access to the DOM element and
        // the options via the instance, e.g. this.element 
        // and this.options
    };

    // A really lightweight plugin wrapper around the constructor, 
    // preventing against multiple instantiations
    $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, 
                new Plugin( this, options ));
            }
        });
    }

})( jQuery, window, document );

Я включил комментарии, чтобы ссылаться на них в своих вопросах.

У меня есть грубая идея, почемуwindow а такжеdocument были включены в аргумент анонимной функции, которая оборачивает плагин(Я не знаю, как еще это назвать) потому что в комментариях указано, что это как бы сокращает время выполнения. Но как это работает? Любой аргумент упомянутой анонимной функции, заключающей в себе плагин, передается куда? И как они решаются в плагине?

Обычно я бы сделал$(window).resize(function(){}) но это не работает в этом случае. Если я сделаюconsole.log(window) внутри функции плагина он говорит «неопределенный».

Что подводит меня к другому вопросу: что такоене определено? Разве это нетип данных который назначен наобъект что не определено в объеме? Как это можно передать в качестве аргумента? Разве аргументы не должны быть объектами? В комментариях написано несколько строк об этом, но я не понимаю ни слова об этом: <так что мы можем гарантировать, что его значение действительно не определено> аааа?

Подводить итоги:

Что на самом деле подразумевается подfunction($)?Почему я должен включитьwindow, document а такжеundefined в качестве аргументовfunction($)?Если я делаю это, как я могу получить доступ к фактическомуwindow а такжеdocument объекты?undefined что и почему?

Пожалуйста, успокойся на мне. Я никогда не изучал язык программирования как предмет для явной цели написания приложений. Я изучил базовый C для написания аппаратно-ориентированных низкоуровневых подпрограмм для крошечных ядерных микроконтроллеров, и на этом все. Я изучил C ++ и немного Java самостоятельно. Просто чтобы вы знали, чего ожидать.

Ответы на вопрос(4)

Ваш ответ на вопрос