Usando 'window', 'document' e 'undefined' como argumentos em uma função anônima que envolve um plugin jQuery

Honestamente, eu não sabia como tornar o título mais curto.

Eu aprendi a escrever um plugin jQuery, estudando a fonte deSlidesJS plugar. Quando eu encontrei algo novo, eu apenas perguntei ao meu bom amigoGoogle e na maioria das vezes, obteve uma resposta satisfatória. Honestamente, nunca fiz muito esforço. Tudo o que sei é que$ é (provavelmente) um construtor de objetos jQuery abreviado e que$() ejQuery() são a mesma coisa desde que o jQuery esteja incluído.

Recentemente, porém, tentei entender a ciência por trás do jQuery e como escrever umBoa Plugin jQuery. Me deparei com um muito bomartigo em que o autor listou váriosmodelos para criar um plugin jQuery. Como o resto era muito complexo para eu entender, gostei do primeiro:Um começo leve. Agora, aqui está o código para o dito modelo.

/*!
 * 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 );

Eu incluí os comentários para referenciá-los nas minhas perguntas.

Eu tenho uma idéia crua porquewindow edocument foram incluídos no argumento da função anônima que envolve o plugin(Eu não sei mais o que chamar) porque é dado nos comentários que meio que encurta o tempo de execução. Mas como isso funciona? Qualquer argumento da referida função anônima envolvendo o plugin é passado para onde? E como estas são abordadas no plugin?

Normalmente, eu faria$(window).resize(function(){}) mas isso não funciona neste caso. Se eu fizerconsole.log(window) dentro da função Plugin, diz 'indefinido'.

O que me leva à outra questão que é: o que éIndefinido? Não é umtipo de dados que é atribuído a umobjeto que não está definido no escopo? Como pode ser passado como um argumento? Os argumentos não precisam ser objetos? Existem algumas linhas escritas sobre isso nos comentários, mas eu não entendo uma palavra:para que possamos garantir que seu valor seja verdadeiramente indefinido> whaaa

Resumindo:

O que realmente significafunction($)?Por que devo incluirwindow, document eundefined como argumentos defunction($)?Se eu fizer isso, como faço para acessar o realwindow edocument objetos?undefined oque e porque?

Por favor, vá com calma comigo. Eu nunca estudei linguagem de programação como um assunto para o propósito expresso de escrever aplicativos. Eu estudei C básico para escrever rotinas de baixo nível orientadas a hardware para microcontroladores de núcleo minúsculos e isso é apenas sobre isso. Eu aprendi C ++ extensivamente e um pouco de Java sozinho. Só assim você saberia o que esperar.

questionAnswers(4)

yourAnswerToTheQuestion