2012-02-24 14 views
39

Eventuali duplicati:
JavaScript: var functionName = function() {} vs function functionName() {}
Declaring functions in JavaScriptJavascript Funzione Definizione Sintassi

Ho visto 2 sintassi differenti per definire le funzioni in javascript:

function f() { 
    ... 
} 

Oltre come

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

Qual è la differenza tra questi? Uno di loro è deprecato?

+0

Ecco una risposta alla tua domanda: http://stackoverflow.com/a/1013387/236135 ed ecco la domanda che è stata posta con i termini appropriati http://stackoverflow.com/questions/1013385/che cosa-è-la -differenza-tra-a-funzione-espressione-vs-dichiarazione-in-javascrip –

risposta

44

Nessuno dei due è deprecato ed entrambi funzioneranno. La differenza qui è che uno è una funzione con nome (function f()) mentre l'altra è una variabile uguale a una funzione (var f = function()).

È necessario fare attenzione quando si impostano le variabili uguali alle funzioni. Ciò funzionerà:

var f = function(n) { console.log(n); }; 
f(3); // logs 3 

Ma questo si romperà, dal momento che la variabile è definita dopo la chiamata ad esso.

f(3); // what is f? breaks. 
var f = function(n) { console.log(n); }; 

Ma le normali funzioni funzionano correttamente.

function abc(n) { console.log(n); } 

abc(3); // logs 3 
xyz(5); // logs 5 

function xyz(n) { console.log(n); } 

Ciò è perché il codice viene analizzato prima dell'esecuzione, e tutte le funzioni sono disponibili da chiamare. Ma impostare una var uguale a una funzione è come impostare var per qualcos'altro. L'ordine di quando accade è importante.

Ora, per alcune cose più confuso ...

ci sono anche funzioni anonime 'self-executing'. Vanno con una varietà di nomi. Il modo più comune per farlo è qualcosa del genere:

(function() { 
    // code in here will execute right away 
    // since the() at the end executes this (function(){}) 
})(); 

Esiste anche una versione probabilmente migliore.

!function() { 
    // again, the tailing() will execute this 
}(); 

Scopri this Stack Overflow post per ulteriori informazioni sulle funzioni anonime.

+1

Puoi anche avere funzioni nominative autoinvitanti: '(function foo() {...}())', o funzioni con nome assegnate a una variabile: 'var foo = function bar() {...};'. La vera differenza degna di nota è che una è una * dichiarazione di funzione * che deve sempre essere nominata, mentre una * espressione di funzione * può essere nominata o anonima. –

+0

@FelixKling Buon punto. Le funzioni con nome auto-invocato '(function foo() {...}())' sono interessanti dal momento che puoi chiamare 'foo' da dentro se stesso, ma non all'esterno. Anche quando lo scrivi come '! Function foo() {...}();'. – Marshall

+1

Sì, quando si ha un'espressione di funzione con nome, il nome è disponibile solo all'interno della funzione stessa. Purtroppo, IE ha alcuni problemi con le espressioni di funzioni con nome (crea due copie della stessa funzione), quindi è meglio evitarlo.Ma teoricamente funziona;) –