2013-06-12 18 views
21

W wielu miejscach widzę skrypty tak:Dlaczego warto skorzystać z funkcji wykonywania poleceń?

(function() { 
    var hello = 'Hello World'; 
    alert(hello); 
})(); 

Dlaczego nie po prostu napisz to w ten sposób, bez jakiejkolwiek funkcji:

var hello = 'Hello World'; 
alert(hello); 
+1

Utrzymanie globalnej przestrzeni nazw w czystości jest jeden konkretny powód - zmniejszając tym samym prawdopodobieństwo konfliktu. – techfoobar

Odpowiedz

26

Używamy siebie funkcję wykonywania, zarządzać zmiennym.

Zakres zmiennej jest regionem o programie, w którym jest zdefiniowana. Zmienna globalna ma zasięg globalny; jest zdefiniowany wszędzie w twoim kodzie JavaScript. (Nawet w swoich funkcjach). Z drugiej strony, zmienne zadeklarowane w funkcji są zdefiniowane tylko w treści funkcji. Są to zmienne lokalne i mają zasięg lokalny. Parametry funkcji są również liczone jako zmienne lokalne i są zdefiniowane tylko w treści funkcji.

var scope = "global"; 
function checkscope() { 
    alert(scope); 
} 

checkscope(); // global 

Jak widać, można uzyskać dostęp do zmiennej scope wewnątrz funkcji, ale w ciele funkcji, zmienna lokalna ma pierwszeństwo przed globalnej zmiennej o tej samej nazwie. Jeśli zadeklarujesz zmienną lokalną lub parametr funkcji o tej samej nazwie, co zmienna globalna, skutecznie ukryjesz zmienną globalną.

var scope = "global"; 
function checkscope() { 
    var scope = "local"; 
    alert(scope); 
} 

checkscope(); // local 
alert(scope); // global 

Jak widać, zmienna wewnątrz funkcji nie zastąpi zmiennych globalnych. Z powodu tej funkcji wstawiamy kod do funkcji self executing, , aby zapobiec zastąpieniu innych zmiennych, , gdy nasz kod stanie się duży i duży.

// thousand line of codes 
// written a year ago 

// now you want to add some peice of code 
// and you don't know what you have done in the past 
// just put the new code in the self executing function 
// and don't worry about your variable names 

(function() { 
    var i = 'I'; 
    var can = 'CAN'; 
    var define = 'DEFINE'; 
    var variables = 'VARIABLES'; 
    var without = 'WITHOUT'; 
    var worries = 'WORRIES'; 

    var statement = [i, can, define, variables, without, worries]; 

    alert(statement.join(' ')); 
    // I CAN DEFINE VARIABLES WITHOUT WORRIES 
}()); 
12

IIFE (bezpośrednio powoływać wypowiedzi funkcja) pozwala uniknąć tworzenia zmiennej globalnej hello.

Istnieją inne zastosowania, jak również, ale na przykład kodu, który pisał, że byłby powód.

+0

Aby przedłużyć tę sytuację. IIFE doskonale nadaje się również do tworzenia niestandardowych przestrzeni nazw, które będą "rozszerzeniem" wspomnianej funkcji. –

5

Oprócz utrzymywania globalnej przestrzeni nazw czyste, są one także przydatne do ustalenia metod prywatnych dla funkcji dostępnych jednocześnie odsłaniając pewne właściwości do późniejszego wykorzystania -

var counter = (function(){ 
    var i = 0; 

    return { 
    get: function(){ 
     return i; 
    }, 
    set: function(val){ 
     i = val; 
    }, 
    increment: function() { 
     return ++i; 
    } 
    }; 
}()); 

// 'counter' is an object with properties, which in this case happen to be 
// methods. 

counter.get(); // 0 
counter.set(3); 
counter.increment(); // 4 
counter.increment(); // 5 
2

Nie może być kilka powodów.

Pierwszy to ochrona zakresu, ponieważ funkcja tworzy nowy zakres.

Kolejny może być zmienne wiążące, na przykład

for (var i = 0; i < n; i++) { 
    element.onclick = (function(i){ 
     return function(){ 
     // do something with i 
    } 
    })(i); 
} 
+0

Czy można w ten sposób zamknąć uruchamianie całej aplikacji internetowej?Jeśli tak, byłby to doskonały sposób na deklamowanie globalnej przestrzeni nazw. Ale pytanie, które mam w tym momencie, brzmi: w jaki sposób można uczynić pożądane jednostki * trwałe * używając tego? Czy będę musiał się odwołać, aby to osiągnąć? –

Powiązane problemy