Использование «окна», «документа» и «неопределенного» в качестве аргументов в анонимной функции, которая оборачивает плагин 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 самостоятельно. Просто чтобы вы знали, чего ожидать.