Uso de 'ventana', 'documento' y 'indefinido' como argumentos en una función anónima que envuelve un complemento jQuery

Honestamente, no sabía cómo hacer el título más corto.

Aprendí a escribir un complemento de jQuery estudiando la fuente deSlidesJS enchufar. Cuando encontré algo nuevo, le pregunté a mi buen amigo.Google Y la mayoría de las veces, obtuve una respuesta satisfactoria. Honestamente, nunca hice mucho esfuerzo. Todo lo que sé es que$ es (probablemente) un constructor de objetos jQuery y ese$() yjQuery() Son lo mismo siempre que se incluya jQuery.

Recientemente, sin embargo, traté de entender la ciencia detrás de jQuery y cómo escribir unbueno jQuery plugin. Me encontré con una muy buenaartículo en la que el autor enumera variasplantillas para crear un plugin jQuery. Como el resto era demasiado complejo para que yo lo entendiera, me gustó el primero:Un comienzo ligero. Ahora, aquí está el código para dicha plantilla.

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

He incluido los comentarios para referirme a ellos en mis preguntas.

Tengo una idea cruda de por quéwindow ydocument se han incluido en el argumento de la función anónima que envuelve el complemento(No sé cómo llamarlo) Debido a que se encuentra en los comentarios, algo así acorta el tiempo de ejecución. pero como funciona? ¿Cualquier argumento de dicha función anónima que envuelve el complemento se pasa a dónde? ¿Y cómo se abordan en el plugin?

Normalmente lo haria$(window).resize(function(){}) Pero eso no funciona en este caso. Si lo hagoconsole.log(window) Dentro de la función Plugin, dice 'indefinido'.

Lo que me lleva a la otra pregunta que es: ¿Qué es?indefinido? No es untipo de datos que se asigna a unobjeto Eso no está definido en el alcance? ¿Cómo se puede pasar como argumento? ¿No tienen que ser los argumentos los objetos? Hay algunas líneas escritas sobre esto en los comentarios, pero no entiendo ni una palabra: <para que podamos asegurarnos de que su valor es verdaderamente indefinido> qaaa?

Para resumir:

Lo que de hecho se entiende porfunction($)?¿Por qué debería incluirwindow, document yundefined como argumentos defunction($)?Si lo hago, ¿cómo accedo al real?window ydocument ¿objetos?undefined ¿qué y por qué?

Por favor, fíjate en mí. Nunca estudié el lenguaje de programación como materia con el propósito expreso de escribir aplicaciones. Estudié C básico para escribir rutinas de bajo nivel orientadas a hardware para microcontroladores de núcleo pequeño y eso es todo. Aprendí C ++ extensivamente y un poco de Java por mi cuenta. Sólo para que sepas qué esperar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta