jQuery dollar sign ( $ ) jako argument funkcji?

Rozumiem zamknięcia JavaScript i widziałem to w natywnym JS:

(function () {
  // all JS code here
})();

Ale co robi dodawanie jQuery spice?

(function ($) {
  // all JS code here
})(jQuery);
Author: ma11hew28, 2011-02-13

4 answers

Jest to sposób mapowania jQuery do $ w taki sposób, aby nie cały kod na stronie go widział.

Być może masz istniejący skrypt, który używa jQuery, który chcesz ponownie użyć, ale używasz również prototype, który również używa $ na tej samej stronie.

Owijając dowolny jQuery używając kodu w tej konstrukcji, redefiniujesz $ do jQuery dla zawartej części bez wchodzenia w konflikt z innym kodem na stronie.

 33
Author: David Mårtensson,
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
2011-02-13 08:21:39

Kiedy widzisz:

(function() {
  // all JS code here
})();

Jest znana jako samo-wywołująca się funkcja anonimowa . Funkcja jest wykonywana zaraz po jej przetworzeniu z powodu dodania () na końcu (w ten sposób uruchamiasz funkcje js).

Zauważ, że dodatkowe szelki zewnętrzne to tylko konwencja, możesz też napisać to tak:

function() {
  // all JS code here
}();

Ale ta konwencja jest mocno używana wszędzie i powinieneś się jej trzymać.

(function($) {
  // all JS code here
})(jQuery);

Tutaj $ jest odwzorowywane na jQuery obiekt tak, że ty przydałoby się $ zamiast słowa kluczowego jQuery. Można też umieścić tam jakąś inną postać:

(function(j) {
  // all JS code here
})(jQuery);

Tutaj {[9] } jest odwzorowywany na jQuery obiekt.

Zauważ również, że argumenty określone dla funkcji samo-wywołującej pozostają w zakresie tej funkcji i nie są sprzeczne z zewnętrznym zakresem / zmiennymi.


Napisałem artykuł na ten temat, proszę sprawdzić:

 51
Author: Sarfraz,
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
2011-02-13 08:24:59
(function() {
   // all JS code here
})();

Jest bezpośrednio wywołanym wyrażeniem funkcji ( IIFE ), wymawianym "iffy". Niektórzy nazywają je też "anonimowymi, samo-wykonującymi się funkcjami", lub po prostu"samo-wykonującymi funkcjami".

(function(aParameter) {
   alert(aParameter);  // will alert "an argument"
})("an argument");

Oto IIFE, które pobiera parametr "aparat" i przekazuje sobie argument "argument".

(function($){
   alert($(window).jquery);  // alert the version of jQuery
})(jQuery);

Ten jest podobny, ale" jQuery "(instancja obiektu jQuery) jest argumentem IIFE i w tym przypadku jQuery jest przekazywany jako parametr'$'. W tym sposób, po prostu wpisując'$', ciało IIFE ma dostęp do jQuery i jego członków. Jest to wspólna konwencja jQuery i jest to wspólne dla osób piszących wtyczki jQuery, aby utrzymać tę konwencję w ten sposób.

Powyższy kod nie tylko zachowuje konwencję jQuery, ale także zapewnia, że ani ty, ani nikt inny nie może przypadkowo złamać tej konwencji. Np. weź następujący kod:

var $ = function() {
   alert('foo');
}

Ten kod zamienia ' $ ' w coś, co zdecydowanie nie jest jQuery. Jeśli ktoś zrobił to w innym kodzie poza kodem wtyczki, a następnie nie jawnie przekazać jQuery jako " $ "do wtyczki, to nie będzie w stanie użyć" $ " jako jQuery jak zwykle zrobić.

 17
Author: Hawkeye Parker,
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-06-01 22:48:37

Są dwa powody, dla których jQuery jest zamykane w ten sposób.

Zdecydowanie najbardziej znaczące jest to, że sprawia, że Twój kod działa na stronach, które używają jQuery 's" bez konfliktu " tryb , który pozwala na użycie jQuery wraz z innymi bibliotekami, które chcą kontrolować $ globalny. Z tego powodu technika (function($) { ... })(jQuery) jest silnie zalecana przy pisaniu wtyczek jQuery.

Drugim powodem jest to, że czyni $ zmienną lokalną w zakresie funkcja samoczynna i dostęp do zmiennych lokalnych jest (marginalnie) szybszy niż dostęp do zmiennych globalnych. Osobiście nie uważam tego za bardzo przekonujący powód - nie wyobrażam sobie scenariusza, w którym narzut korzystania z metod jQuery zamiast DOM byłby akceptowalny, ale dostęp do jQuery jako zmiennej globalnej nie byłby.: -)

Powiedziałbym, że najlepszym powodem, aby użyć tej techniki, gdy Nie pisanie wtyczki jest dla spójności - jesteś mniej prawdopodobne, aby zapomnieć to zrobić kiedy to jest Ważne, Jeśli masz w zwyczaju robić to, kiedy nie jest . Poza tym nigdy nie wiesz, kiedy będziesz miał okazję do recyklingu kodu!

 11
Author: Ben Blank,
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
2011-02-13 19:17:27