Używanie 'window', 'document' i 'undefined' jako argumentów w anonimowej funkcji, która otacza wtyczkę jQuery
Szczerze mówiąc, nie wiedziałem, jak skrócić ten tytuł.
Nauczyłem się pisać wtyczkę jQuery, studiując źródłoSlidesJS podłącz. Kiedy natknąłem się na coś nowego, właśnie zapytałem mojego dobrego przyjacielaGoogle i przez większość czasu otrzymałem satysfakcjonującą odpowiedź. Szczerze mówiąc, nigdy się nie starałem. Wiem tylko tyle$
jest (prawdopodobnie) skrótowym konstruktorem obiektów jQuery i tym$()
ijQuery()
są tym samym, co dołączono do jQuery.
Ostatnio jednak starałem się zrozumieć naukę związaną z jQuery i pisaćdobry wtyczka jQuery. Natknąłem się na bardzo dobreartykuł w którym autor wymienił kilkaszablony za stworzenie wtyczki jQuery. Ponieważ reszta była dla mnie zbyt skomplikowana, by ją zrozumieć, podobała mi się pierwsza:Lekki start. Oto kod tego szablonu.
/*!
* 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 );
Dodałem komentarze, aby odnieść się do nich w moich pytaniach.
Mam surowy pomysł, dlaczegowindow
idocument
zostały uwzględnione w argumencie anonimowej funkcji, która otacza wtyczkę(Nie wiem, jak to nazwać) ponieważ w komentarzach podano, że to trochę skraca czas wykonania. Ale jak to działa? Każdy argument tej anonimowej funkcji owijającej wtyczkę zostaje przekazany do gdzie? A jak są one uwzględnione w wtyczce?
Normalnie bym to zrobił$(window).resize(function(){})
ale to nie działa w tym przypadku. Jeśli zrobięconsole.log(window)
wewnątrz funkcji Plugin mówi „undefined”.
To prowadzi mnie do innego pytania: co to jestniezdefiniowany? Czy to nie jesttyp danych który jest przypisany doobiekt który nie jest zdefiniowany w zakresie? Jak można go przekazać jako argument? Czy argumenty nie muszą być przedmiotami? W komentarzach napisano o tym kilka wierszy, ale nie rozumiem ani słowa: <więc możemy zapewnić, że jego wartość jest naprawdę niezdefiniowana> co?
Podsumowując:
Co tak naprawdę oznaczafunction($)
?Dlaczego powinienem to uwzględnićwindow
, document
iundefined
jako argumentyfunction($)
?Jeśli to zrobię, jak uzyskać dostęp do rzeczywistegowindow
idocument
przedmioty?undefined
Co i dlaczego?Proszę, bądź dla mnie łatwy. Nigdy nie uczyłem się języka programowania jako przedmiotu w wyraźnym celu pisania aplikacji. Studiowałem podstawowe C do pisania zorientowanych sprzętowo niskopoziomowych procedur dla małych rdzeniowych mikrokontrolerów i to wszystko. Nauczyłem się C ++ szeroko i trochę Java na własną rękę. Po prostu wiesz, czego się spodziewać.