2011-11-29 13 views
14

jestem debugowania cudzego kodu JavaScript i większość kodu jest owinięty tak:

(function ($) { 
    //majority of code here... 
})(jQuery); 

Co się dzieje z ($) i (jQuery)? Nie nauczyłem się tak kodować i nie widziałem ich. Jaki jest ich cel?

Również nie ma document.ready, ale zakładam, że to dlatego, że kod jest wykonywany zaraz po jego przeczytaniu przez (); na końcu?

+0

Ten kod zostanie wykonany na document.ready – longbkit

+5

@longbkit: Nie, to nie jest kod DOM gotowy. – RightSaidFred

+4

@longbkit, nie, to nie to, co to oznacza. Proszę, idź i przeczytaj o zamknięciu .. lub, u diabła, zacznij uczyć się javascript. –

Odpowiedz

16
var $ = "some value we don't care about"; 

// v=====normal plain old function 
(function ($) { 
//  ^=======receives jQuery object as the $ parameter 

    //majority of code here, where $ === jQuery... 

    $('.myclass').do().crazy().things(); 


})(jQuery); 
// ^=======immediately invoked, and passed the jQuery object 


// out here, $ is undisturbed 
alert($); // "some value we don't care about" 
+3

Okay, więc w zasadzie chodzi o to, aby wywołać jQuery z notacją $() wewnątrz tej funkcji i poza tą funkcją, jeśli coś innego jak prototyp używa notacji $(), to nie ma znaczenia ... Tak naprawdę to po prostu oszczędza ci konieczności pisania jQuery() (lub jakiejś innej notacji) za każdym razem kiedy nie używasz konfliktu .. ma sens – tsdexter

+2

Zasadniczo wszystko, co jest w 'większości kodu tutaj ...' bit, jest izolowane z pozostałej części kodu. Istnieje w osobnym zakresie. Jeśli utworzysz "var something = 1", nie kończy się to na globalnym zasięgu 'window'. Kod znajdujący się poza tą strukturą nie może nadpisać niczego, co jest w środku. –

+1

@tsdexter: Tak, masz to. Globalne 'jQuery' odwołuje się do lokalnego' $ ', co oznacza, że ​​globalne' $ '(jeśli jest) może być użyte do innych celów.W JavaScript, zakres zmienny jest tworzony z funkcją. – RightSaidFred

13

Funkcja ta jest przydatna, gdy chcesz/potrzeby korzystania jQuery.noConflict(), a globalna nazwa $ nie jest aliasem dla jQuery. Opublikowany kod pozwala użyć krótszego $ do oznaczenia jQuery tylko w funkcji anonimowej, bez konieczności posiadania statusu globalnego.

+0

Dzięki, chociaż RightSaidFred pobił cię do tego. Bardzo doceniane. – tsdexter

+0

+1 za wymienienie 'jQuery.noConflict', co powoduje, że jQuery rezygnuje z globalnego' $ '. – RightSaidFred

0

Ta struktura nazywa się wtyczką JQuery, celem wtyczek jest stworzenie szkieletu dowolnego typowego zadania/funkcji w projekcie, w ten sam sposób można rozszerzyć wtyczki zgodnie z użytkowaniem na innej stronie lub na tej samej stronie. w ten sposób możesz uniknąć powtarzania tego samego kodu wszędzie.

to sprawdzić http://docs.jquery.com/Plugins/Authoring

+0

Ta struktura nie jest zwykłą konstrukcją jQuery. I chociaż może być używany podczas tworzenia wtyczki, nie musi tak być. Wtyczki jQuery są tworzone przez rozszerzenie 'jQuery.prototype'. – RightSaidFred

3

Wystarczy rozwinąć RightSaidFred's odpowiedź trochę, kiedy pierwszy raz zobaczyłem składnię ()() byłem nieco befuddled, ale to miało sens gdy zdałem sobie sprawę, nawiasy są używane do określenia anonimowy funkcja, a następnie zadzwoń. np:

(function (msg){alert(msg)})('hello'); 

... definiuje funkcję, a następnie wywołuje ją, przekazując "hello" jako parametr.

Więc przykład w pytaniu:

(function ($) { 
    //majority of code here... 
})(jQuery); 

przechodzi jQuery do anonimowej funkcji i odnoszące się do niego jako $ wewnątrz funkcji, w sposób gwarantujący, że $ będzie pracować dla jQuery bez ingerencji w cokolwiek innego .

+1

Z jakiegoś powodu, to wyjaśnienie kliknęło trochę lepiej ze mną :) Dzięki! – JoshP