2012-02-29 13 views
6

bit di una domanda stupida forse.Sintassi della funzione autoeseguibile e sintassi di callback spiegata

Ma voglio capire perché la sintassi della funzione self-executing e il callback che ha è così diverso da tutti gli altri sintassi JS ..

(function() { 
})() 

Ho solo bisogno di capire perché il suo valido incapsulare con () non avrei immaginato che, per essere valido e quindi l'extra () in seguito per la richiamata, (che si trova proprio subito dopo di esso, anche io non avrei aspettato che, per essere valido.

Is qualcuno in grado di spiegarmi questo?

+0

possibile duplicato di [Come funziona una funzione anonima in JavaScript?] (Http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work) – ziesemer

+0

Un modo alternativo di fare la stessa cosa, che evita tutte le parentesi, è 'nuova funzione() {...};'. New invoca la funzione per te. – jpsimons

+0

@darkporter: una delle principali differenze è che 'new function() {...}' richiama la funzione * come costruttore *. Quindi 'questo' sarà diverso all'interno, e l'espressione valuterà l'oggetto appena creato invece di qualsiasi cosa 'function() {...}' restituisce. (Immagino che tu lo sappia già, ma penso che valga la pena renderlo esplicito a beneficio di chi non lo fa!) – ruakh

risposta

14

La parte function (...) {...} è un'espressione funzione, cioè, un'espressione che rappresenta una funzione. L'unica ragione che deve essere avvolto in parentesi in questo caso è che se la parola chiave function è la prima cosa in una dichiarazione, allora la dichiarazione si presume essere una dichiarazione funzione di, vale a dire, una dichiarazione di funzione. (In realtà, non necessariamente deve essere avvolto in parentesi, funziona anche come prefisso con un +, o in generale per mettere qualsiasi tipo di token prima function che impedisce l'interpretazione funzione-economico.)

L' () parte dopo l'espressione della funzione è la stessa del normale () per chiamare una funzione. Questo:

(function (...) {...})(...); 

è (a parte la variabile temporanea) lo stesso di questo:

var f = function (...) {...}; 
f(); 

che è equivalente alla presente:

function f(...) {...}; 
f(); 
+0

Grazie a tutti, grazie ruakh. Ho quello che stai dicendo. Immagino che la gobba comprenda i 3 modi in cui una funzione può effettivamente essere dichiarata. – Baconbeastnz

2

Essenzialmente le parentesi esterne permettono l'oggetto funzione per essere completamente interpretato e istanziato, in modo che una volta che si esce dall'ambito di quelle parentesi l'oggetto funzione è pronto per essere chiamato.

2

vedere qui:

Quando si dichiara come hai fatto, lo si utilizza come espressione di funzione (3 ° modo di definire la funzione dal link qui sotto). Come con qualsiasi espressione, questo (expression) valuta all'espressione - le parentesi qui usate sono stabilire la precedenza dove necessario. Così si può scrivere questo per esempio:

var f = function(a) { 
    var s = ((((1)))) + ((((a)))); 
    console.log(s); 
}; 

(((((f))))) (2); 

(live example) e quindi rimuovere tutte le parentesi inutili con lo stesso risultato (che è la stampa di 1 + 2 = 3, essenzialmente). Il risultato di:

(function(...) { ... }) 

è una funzione che accetta alcuni argomenti e ha un corpo da eseguire.Questo:

(function(...) { ... })() 

è più o meno equivalente a:

var f = (function(...) { ... }); 
// Now f is a function that can be called 
f(); 

funzioni anonime sono utili, tra le altre cose, per due motivi - sono anonimi (cioè non creano ulteriori nomi - vedere di nuovo il link SOq sopra) e sono "contenitori" per altre cose che non hanno bisogno di essere globali.

0

Quello che hai qui è un'espressione di funzione invocata immediatamente nota anche come IFFE (leggi iffy) ed è un modello di progettazione che produce scope lessicale utilizzando l'ambito della funzione JS. Questi sono utilizzati per evitare il sollevamento variabile, inquinando l'ambiente globale e consentendo contemporaneamente l'accesso pubblico ai metodi, pur mantenendo la privacy locale delle variabili dichiarate all'interno della funzione. La chiave per comprendere questo è che JS ha scope di funzione e non scope scope e passa valori per riferimento all'interno di una chiusura. Puoi leggere ulteriori informazioni al riguardo a Immediately-invoked function expression.

Problemi correlati