2012-08-11 5 views
19

Possible Duplicate:
What does the exclamation mark do before the function?Perché utilizzare l'operatore NOT sulla chiamata di funzione anonima? (Alla Knockout 2.1.0)

Se si guarda al source code for KnockoutJS 2.1.0 si vedrà una struttura di codice come questo inizio sulla linea 7:

!function(factory) { ... }(factoryDefinition); 

L'operatore non provoca questa espressione per valutare a true anziché undefined, ma perché preoccuparsi?

+0

Sì, sembra che abbia la stessa domanda della domanda "punto esclamativo". Mi scuso, non l'ho notato nella mia ricerca. – CgodLEY

+0

@CgodLEY: la ricerca di StackOverflow non funziona molto bene con la punteggiatura e altri simboli. Aiuta un po 'a spiegarlo. –

+0

Lo si utilizza per provocare l'invocazione immediata della funzione rendendola simile a un'espressione e non a un'istruzione. – dakt

risposta

38

Questo è un modo conciso per formare un'espressione di funzione immediatamente eseguita.

Tradizionalmente, le persone hanno utilizzato queste due forme

(function(){ }()); // Recommended by Crockford 
(function(){ })(); // What most people use 

Se si tenta di utilizzare solo

function(){ }(); // Syntax error 

sarà un errore di sintassi, perché viene interpretato come una dichiarazione di funzione piuttosto che un espressione. Questo è il motivo per cui è necessario avvolgere la funzione tra parentesi.

Ma se si mette un operatore unario prima della dichiarazione di funzione, non è necessario aggiungere una parentesi cosing e si taglia via un carattere del codice, che è un (molto) piccolo vantaggio di prestazioni. Esistono diversi operatori unari che possono essere utilizzati allo stesso scopo

!function(){ }(); 
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 
3

Perché se non si fa qualcosa allora sembra un errore di sintassi:

function(factory) { ... }(factoryDefinition); 

provarlo.

È necessario portare il parser in un punto in cui si aspetta un'espressione, in modo che la parola chiave function sia riconosciuta in quel contesto. Altrimenti, quando il parser vede function come il primo token in un'istruzione, si aspetta una dichiarazione di funzione semplice e che non può essere seguita da un elenco di argomenti con parentesi.

Esistono varie alternative, attorno a ciascuna delle quali sono raggruppate varie opinioni.

+0

Ho provato la seguente espressione su NodeJS e mi è sembrato giusto, mi manca qualcosa? 'function (message) {console.log (messaggio)} ('ciao');' risultato: 'ciao' – CgodLEY

+0

@CgodLEY Che non funziona nella mia console del nodo ... (L'output è' ... ') –

+0

No, il nodo mi dà un errore di sintassi. (In effetti lo prendo al paren aperto nella dichiarazione di funzione, perché una dichiarazione di funzione senza un nome di funzione è errata – Pointy

Problemi correlati