2011-12-23 11 views
13

ho visto:Come funziona esattamente! Function() {}()?

!function(){ //code }(); 

utilizzato in molti punti di eseguire immediatamente una funzione anonima. Normalmente, è utilizzato in luogo di:

(function(){ //code }()) 

Qualcuno sa come la ! rende di fatto la funzione di eseguire?

+0

Vale la pena sottolineare che mentre il primo funziona, nega il valore restituito dalla funzione, mentre il secondo non lo fa. – toddsundsted

+0

Perché viene utilizzato invece di terminare appena l'istruzione con un punto e virgola? È ancora solo un personaggio. – js1568

risposta

38

Cosa! fa

Quando si utilizza !, la funzione diventa il singolo operando della unario (logico) NOT operatore .

Questo impone la funzione da valutare come espressione, che consente di richiamarla immediatamente in linea.


Altre alternative

si può fare questo con qualsiasi operatore. Ecco alcuni esempi ...

'invoke',function(){ /*code*/ }(); 
1+function(){ /*code*/ }(); 
void function(){ /*code*/ }(); 
~function(){ /*code*/ }(); 
+function(){ /*code*/ }(); 

La cosa bella di alcuni di questi è che il significato dell'operatore non è sovraccarico.


Il problema con ()

Quando si utilizza () intorno alla funzione, si può colpire alcuni bug che si sorgere se si dispone di più di una di fila senza un punto e virgola che li separa .

(function() { 
    alert('first'); 
}()) 


(function() { 
    alert('second'); 
}()) 

// TypeError: undefined is not a function 

Ciò comporterà un TypeError, poiché la coppia di esterno () intorno alla seconda funzione sarà interpretato come intenda chiamata una funzione. Il primo non restituisce una funzione, ovviamente, quindi stai cercando di chiamare il numero undefined.


Come utilizzando un operatore diverso affronta (o evita) il problema

Anche un operatore come +, che sovraccarica certa misura non causerà un errore.

Se si esegue questa operazione ...

+function() { 
    alert('first'); 
}() 

+function() { 
    alert('second'); 
}() 

Il primo + viene interpretato come + unario operatore, e converte il risultato restituito dalla prima funzione, che in questo caso è undefined modo che viene convertito in NaN.

Il secondo + sarà interpretato come l'operatore aggiunta, e così cercherà di aggiungere NaN al risultato ritorno della seconda funzione, che ancora una volta ecco undefined.

Il risultato, naturalmente, è NaN, ma è innocua. Non c'è codice illegale per generare un errore.


Dimostrazione di come gli operatori interagiscono con le funzioni

Per dimostrare questo, basta dare ogni funzione di un valore di ritorno, poi incollarlo nella console ...

+function() { 
    alert('first'); 
    return "10"; 
}() 

+function() { 
    alert('second'); 
    return 20; 
}() 

// 30 

otterrai i due alert s, e quindi la console mostrerà 30 perché il primo operatore + converte lo Stri ng "10" al numero 10 e il secondo + ha aggiunto i due risultati insieme.

+1

Nuovo nome utente !!!!! –

+0

@AdamRackis: Sì, ho ceduto. –

+0

Risposta fantastica! Hai il mio +1. – Bojangles

2

Il ! è una negazione logica ordinaria.
Il () esegue la funzione.

+5

Penso che l'OP si stia chiedendo perché semplicemente anteporre '!' A 'function() {// code}()' (che è altrimenti un errore) causa l'esecuzione della funzione anonima. – toddsundsted

Problemi correlati