2010-08-31 5 views

risposta

5

L'ho visto spesso di recente. Sto indovinando:

Non c'è bisogno di nominare la funzione. Implica che non sia riutilizzabile. Questo ti dà un ambito locale per dichiarare le variabili usando var (altrimenti le aggiungeresti al globale).

0

È un closure e un anonymous function - concetti chiave in Javascript. Javascript non ha proprietà o campi "veri" privati ​​- ma usando una chiusura puoi essenzialmente creare l'equivalente. Sono un mezzo molto importante per organizzare JS.

Un punto fondamentale in questo campione è la (); alla fine del codice - l'aggiunta di queste parentesi indica Javascript per eseguire il codice immediatamente - in modo efficace l'inizializzazione tutto ciò che è contenuto all'interno.

http://www.jibbering.com/faq/notes/closures/


per contribuire a chiarire (io non sono un esperto di JS-) - questo costrutto, anche se non una chiusura pura, è spesso visto in combinazione con chiusure. Ad esempio, il frammento di sotto (copiato dal mio link qui sotto) utilizza questa sintassi per definire un metodo nascosto interna:

function callLater(paramA, paramB, paramC){ 
    /* Return a reference to an anonymous inner function created 
     with a function expression:- 
    */ 
    return (function(){ 
     /* This inner function is to be executed with - setTimeout 
      - and when it is executed it can read, and act upon, the 
      parameters passed to the outer function:- 
     */ 
     paramA[paramB] = paramC; 
    }); 
} 

... 

/* Call the function that will return a reference to the inner function 
    object created in its execution context. Passing the parameters that 
    the inner function will use when it is eventually executed as 
    arguments to the outer function. The returned reference to the inner 
    function object is assigned to a local variable:- 
*/ 
var functRef = callLater(elStyle, "display", "none"); 
/* Call the setTimeout function, passing the reference to the inner 
    function assigned to the - functRef - variable as the first argument:- 
*/ 
hideMenu=setTimeout(functRef, 500); 

Anche se: questo esempio non significa eseguire immediatamente (manca la ();) dopo la definizione della funzione interiore. Quindi, in questo caso, la funzione allegata viene valutata in un secondo momento nel tempo - quelli () sono molto diversi in un linguaggio funzionale.

+0

Una chiusura, come hai affermato, è un concetto chiave in JavaScript. Ma essenzialmente è mantenere o evitare riferimenti a variabili che appartengono al contesto di esecuzione della funzione che le accede. La cosa qui è che non ci sono variabili, e che dopotutto non è il punto della domanda. Non sto rendendo nessuna variabile accessibile al di fuori del suo contesto originale. Quindi ... dove sono le chiusure qui? Ho visto in forma un downvote ("La risposta non è utile"). Se vuoi, posso tirarlo fuori, ma la tua risposta ha poco in comune con il resto. – DanC

+0

"non ci sono variabili". - Nell'esempio non c'è nulla, supponevo che il caso che stavi esaminando probabilmente contenesse membri come variabili e altre funzioni, il che avrebbe comportato un tale chiusura. È qualcosa che ho visto raramente per script semplici/procedurali Javascript – STW

+0

Scusa STW, non volevo essere scortese, ma hai visto le altre risposte? Puoi discutere tutto il giorno, ma a questo punto sembra chiaro quello che ho chiesto (date tutte le altre risposte), e la tua risposta non andava bene. Questo era in effetti un duplicato esatto di un'altra domanda che non ho trovato. Grazie comunque per la risposta, ma la tua risposta potrebbe essere più adeguata per un'altra domanda, forse per le chiusure. Inoltre, la tua risposta sembra essere cambiata molto da quella originale. – DanC

0

È utilizzato per eseguire un codice OUT nell'ambito globale. Con questo, si sta utilizzando l'ambito della funzione. In questo caso, l'ambito di una funzione anonima.

Questo è utile quando non si desidera creare vars globali, ad esempio.

See:

var b = 2; 
(function(){ 
    var a=1; 
    alert("a:" + a); // alerts 1 
    alert("b:" + b); // alerts 2 
})(); 
alert("OUT b:" + b); // alerts 2 
alert("OUT a:" + a); // undefined 

veda in jsfiddle.


EDIT:

La sintassi ()() è un altro modo per chiamare una funzione. Vedi

alert(1); // alerts 1 
(alert)(2); // alerts 2 

veda in jsfiddle.

+0

Grazie per la modifica sulla tecnica di chiamata alternativa()() ... Non avrei mai potuto trovare da nessuna parte che lo dicesse semplicemente! – exoboy

0

È un modo per definire una funzione e chiamarla immediatamente. questo è l'ultimo(); lo fa.

Problemi correlati