2012-06-21 35 views
10

Ho visto il codice Javascript che utilizza la parentesi subito dopo la parentesi graffa di chiusura di una funzione, non riesco a capire per cosa sono utilizzati.Cosa significa parentesi dopo parentesi graffe?

Esempio:

function foo(bar){ 
    return bar; 
}(0); 
  • Cosa (0) fare?

  • Come si chiama?

  • Quando utilizzare questa tecnica?

+2

Se hai appena fornito un cattivo esempio, allora la tua domanda è un duplicato di (http [Cosa parentesi che circondano una funzione/dichiarazione di oggetto JavaScript/classe significano?]: //stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-object-function-class-declaration-m). –

risposta

9

Nel tuo esempio, è sufficiente due affermazioni ed è equivalente a:

function foo(bar){ 
    return bar; 
} 
0; 

Questo è non una funzione di autoinvocazione. La prima affermazione è una dichiarazione di funzione , la seconda è semplicemente il numero letterale 0, che non fa nulla. Le parentesi non eseguono la funzione, sono le grouping operator.

Come possiamo provarlo? Prova:

function foo(bar){ 
    return "bar"; 
}(0); 

e dimmi qual è l'uscita.


sarebbe una funzione di auto-invocando, se avessimo un funzione di espressione. Per questo è possibile utilizzare l'operatore di raggruppamento per forzare la valutazione come espressione.

Ad esempio:

(function foo(bar){ 
    return bar; 
})(0); 

Questa è un'espressione funzione denominata. Il risultato dell'espressione ((function ....)) è un riferimento di funzione e (0) esegue la funzione, passando come argomento 0.

La posizione della parentesi potrebbe anche essere:

(function foo(bar){ 
    return bar; 
}(0)); 

forse questo è quello che avete visto.

Questa tecnica è stata già ampiamente discusso qui: What is the purpose of a self executing function in javascript?

+0

Grazie Felix, devi avere gli occhi d'aquila :) – jon

11

Invocano immediatamente la funzione simile a quando si chiama una funzione:

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

foo(); // call 

Si può anche chiamare direttamente:

(function foo(){ 
    alert('hello'); 
})(); // <-------------- 

Attualmente hai Function Declaration . Per realtà auto-invocarlo, è necessario avere in questo modo in parentesi (per rendere l'espressione):

(function foo(bar){ 
    return bar; 
})(0); 

ed ora è Function Expression e richiamerà immediatamente. Per conoscere differenza tra Function Declaration e Function Expression, controllare questo eccellente articolo di Kangax:


Cosa significa (0) fare?

È argomento passato foo funzione in modo bar sarebbe 0 funzione all'interno.

Come si chiama?

È una funzione self-inovking o autoeseguibile. Si potrebbe anche voler vedere this.

Quando utilizzare questa tecnica?

Quando si desidera richiamare immediatamente una funzione e mantenere l'ambito variabile all'interno solo dell'espressione di funzione. Non sarà disponibile per il mondo esterno o piuttosto il codice al di fuori di tale espressione di funzione.


Per saperne di più:

+0

Suggerimento: '(funzione (...) {...}) (...);' funziona sempre, anche con funzioni anonime, dove il valore di ritorno non è assegnato a una variabile –

+0

Purtroppo non è corretto . Vedi la mia risposta. Ma forse l'OP ha dato solo un cattivo esempio. –

+0

@FelixKling: +1 a te. Ho trascurato la sintassi dell'OP, aggiungendo ulteriori dettagli. – Sarfraz

0

Si tratta di una funzione di auto chiamante. Stai passando 0 come parametro. Pertanto la funzione tornerà bar che è uguale a 0.

Per esempio, la funzione qui sotto è l'equivalente:

function foo(bar) { 
    return bar; 
} 

foo(0); // returns 0 
Problemi correlati