2009-03-30 9 views
16

uczę YUI i sporadycznie widział ten idiom:JavaScript idiom: utworzyć funkcję tylko do wywołania to

<script> 
    (function x(){ do abcxyz})(); 
</script> 

Dlaczego oni utworzyć funkcję po prostu ją wywołać? Dlaczego nie po prostu napisać:

<script> 
    do abcxyz 
</script> 

Na przykład zobaczyć here.

+0

Zobacz także: http://stackoverflow.com/questions/631187/javascript-scope-and-closure/ –

Odpowiedz

44

Korzystają z closures.

Krótkie wyjaśnienie: Ponieważ JS używa oscyloskopu na poziomie funkcji, można wykonać szereg czynności w ramach funkcji i pozostawić je w tym zakresie. Jest to przydatne do wywoływania kodu, który nie powoduje bałaganu w globalnej przestrzeni nazw. Pozwala także na tworzenie prywatnych zmiennych - jeśli zadeklarujesz zmienną wewnątrz anonimowej funkcji i wykonasz ją natychmiast, tylko inny kod wewnątrz anonimowej funkcji może uzyskać dostęp do tej zmiennej.

Załóżmy na przykład, że chcę utworzyć globalny unikalny generator identyfikatorów. Można zrobić kodu:

var counter = 0; 
var genId = function() 
{ 
    counter = counter + 1; 
    return counter; 
} 

Jednak teraz każdy może bałagan z licznika, a ja teraz zanieczyszczona globalnej przestrzeni nazw z dwóch zmiennych (licznika i genId).

Zamiast tego mogę korzystać z anonimową funkcję do generowania mój funkcję licznika:

var genId = function() 
{ 
    var counter = 0; 
    var genIdImpl = function() 
    { 
     counter = counter + 1; 
     return counter; 
    } 

    return genIdImpl; 
}(); 

Teraz mam tylko jedną zmienną w globalnej przestrzeni nazw, co jest korzystne. Co ważniejsze, zmienna licznika jest teraz bezpieczna przed modyfikacją - istnieje tylko w zakresie funkcji anonimowej i dlatego tylko funkcja genIdImpl (która została zdefiniowana w tym samym zakresie) może uzyskać do niej dostęp.

Wygląda jak w przykładowym kodzie YUI, oni po prostu chcą wykonać kod, który w ogóle nie zanieczyszcza globalnej przestrzeni nazw.

3

Oni chcą uniknąć kolizji przestrzeni nazw, zgaduję. Wydaje się, że jest to dobra praktyka w JS.

Powiązane problemy