Co oznacza (function ($) {}) (jQuery);?

Dopiero zaczynam od pisania wtyczek jQuery. Napisałem trzy małe wtyczki, ale po prostu kopiowałem linię do wszystkich moich wtyczek, nie wiedząc właściwie, co to znaczy. Czy ktoś może mi powiedzieć coś więcej na ten temat? Być może Wyjaśnienie kiedyś się przyda przy pisaniu frameworka:)

Co to robi? (Wiem, że w jakiś sposób rozszerza jQuery, ale czy jest coś jeszcze ciekawego na ten temat)
(function($) {

})(jQuery);

Jaka jest różnica między następujące dwa sposoby pisania wtyczki:

Typ 1:

(function($) {
    $.fn.jPluginName = {

        },

        $.fn.jPluginName.defaults = {

        }
})(jQuery);

Typ 2:

(function($) {
    $.jPluginName = {

        }
})(jQuery);

Typ 3:

(function($){

    //Attach this new method to jQuery
    $.fn.extend({ 

        var defaults = {  
        }  

        var options =  $.extend(defaults, options);  

        //This is where you write your plugin's name
        pluginname: function() {

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);
Mogę być daleko stąd i być może wszyscy znaczą to samo. Jestem zdezorientowany. W niektórych przypadkach to nie wydaje się działać w wtyczce, którą pisałem przy użyciu typu 1. Jak na razie Typ 3 wydaje mi się najbardziej elegancki, ale chciałbym wiedzieć również o innych.
Author: Lightness Races in Orbit, 2010-05-30

6 answers

Po pierwsze, blok kodu wyglądający jak (function(){})() jest jedynie funkcją wykonywaną w miejscu. Rozwalmy to trochę.

1. (
2.    function(){}
3. )
4. ()

Linia 2 jest prostą funkcją, owiniętą w nawias, aby powiedzieć runtime, aby zwrócił funkcję do zakresu nadrzędnego, gdy zostanie zwrócona funkcja jest wykonywana za pomocą linii 4, może odczytanie tych kroków pomoże

1. function(){ .. }
2. (1)
3. 2()

Widać, że 1 jest deklaracją, 2 zwraca funkcję, a 3 tylko wykonuje funkcja.

Przykład, jak to będzie używane.

(function(doc){

   doc.location = '/';

})(document);//This is passed into the function above

Co do pozostałych pytań dotyczących wtyczek:

Type 1: to nie jest właściwie Wtyczka, to obiekt przekazywany jako funkcja, ponieważ wtyczki zwykle są funkcjami.

Type 2: to znowu nie jest wtyczka, ponieważ nie rozszerza obiektu $.fn. To tylko rozszerzenie rdzenia jQuery, chociaż wynik jest taki sam. To jest, jeśli chcesz dodać funkcje trawersowania, takie jak toArray i tak dalej.

Typ 3: jest to najlepsza metoda dodawania wtyczki, Rozszerzony prototyp jQuery pobiera obiekt posiadający nazwę wtyczki i funkcję i dodaje ją do biblioteki wtyczek dla Ciebie.

 204
Author: RobertPitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 00:48:00

Na najbardziej podstawowym poziomie, coś z formy (function(){...})() jest funkcją dosłowną, która jest wykonywana natychmiast. Oznacza to, że zdefiniowałeś funkcję i natychmiast ją wywołujesz.

Ta forma jest przydatna do ukrywania informacji i hermetyzacji, ponieważ wszystko, co zdefiniujesz wewnątrz tej funkcji, pozostaje lokalne dla tej funkcji i niedostępne ze świata zewnętrznego (chyba że specjalnie to ujawnisz-zwykle za pomocą zwracanego obiektu).

Odmiana tego podstawowa forma jest tym, co widzisz w wtyczkach jQuery (lub ogólnie w tym wzorze modułu). Stąd:

(function($) {
  ...
})(jQuery);

Co oznacza, że przekazujesz odniesienie do rzeczywistego obiektu jQuery, ale jest on znany jako $ w zakresie funkcji dosłownej.

Type 1 nie jest tak naprawdę wtyczką. Po prostu przypisujesz obiekt do jQuery.fn. Zazwyczaj przypisujesz funkcję jQuery.fn, ponieważ wtyczki są zwykle tylko funkcjami.

Type 2 jest podobny do Type 1; tak naprawdę nie tworzysz wtyczki proszę. Po prostu dodajesz obiekt do jQuery.fn.

Type 3 to wtyczka, ale nie jest to najlepszy i najłatwiejszy sposób na jej utworzenie.

Aby zrozumieć więcej na ten temat, spójrz na podobne pytanie i odpowiedź . Ponadto ta strona opisuje szczegóły dotyczące tworzenia wtyczek.

 115
Author: Vivin Paliath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:20

Mała pomoc:

// an anonymous function
  
(function () { console.log('allo') });

// a self invoked anonymous function

(function () { console.log('allo') })();
  
// a self invoked anonymous function with a parameter called "$"
  
var jQuery = 'I\'m not jQuery.';

(function ($) { console.log($) })(jQuery);
 23
Author: leaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-05 06:21:19

Typ 3, aby zadziałał musiałby wyglądać tak:

(function($){
    //Attach this new method to jQuery
    $.fn.extend({     
        //This is where you write your plugin's name
        'pluginname': function(_options) {
            // Put defaults inline, no need for another variable...
            var options =  $.extend({
                'defaults': "go here..."
            }, _options);

            //Iterate over the current set of matched elements
            return this.each(function() {

                //code to be inserted here

            });
        }
    }); 
})(jQuery);

Nie jestem pewien, dlaczego ktoś miałby używać extend over TYLKO bezpośrednio ustawiając właściwość w prototypie jQuery, robi dokładnie to samo tylko w większej ilości operacji i większej bałaganu.

 11
Author: tbranyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 02:20:09

Tylko mały dodatek do wyjaśnienia

Ta struktura (function() {})(); nazywa się IIFE (natychmiast wywołane wyrażenie funkcji), zostanie wykonana natychmiast, gdy interpreter dotrze do tej linii. Więc kiedy piszesz ten wiersz:

(function($) {
  // do something
})(jQuery);

Oznacza to, że interpreter natychmiast wywoła tę funkcję i przekaże jQuery jako parametr, który będzie użyty wewnątrz funkcji jako $.

 8
Author: Commercial Suicide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 19:04:01

Właściwie, ten przykład pomógł mi zrozumieć, co oznacza (function($) {})(jQuery);?

Rozważ to:

// Clousure declaration (aka anonymous function)
var $f = function (x) { return x*x; };
// And use of it
console.log($f(2)); // Gives: 4

// An inline version (immediately invoked)
console.log((function (x) { return x*x; })(2)); // Gives: 4

A teraz:

jQuery jest zmienną zawierającą obiekt jQuery.
$ jest nazwą zmiennej jak każda inna (a, $b, a$b itd. i nie ma specjalnego znaczenia jak w PHP).

var $f = function ($) { return $*$; };
var jQuery = 2;
console.log($f(jQuery)); // Gives: 4

// An inline version
console.log((function ($) { return $*$; })(jQuery)); // Gives: 4
 6
Author: Krzysztof Przygoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 10:26:33