2012-06-21 10 views
28

Ho lavorato a un paio di progetti diversi e ho visto due diversi modi di creare funzioni jQuery/JavaScript.Differenza tra l'assegnazione della funzione alla variabile o no

La prima:

function testFunction(){ 

}; 

La seconda:

var testFunction = function(){ 

}; 

C'è una differenza tra queste?

+3

http: // kangax. github.com/nfe/ leggi questo –

+0

In secondo piano ....... –

risposta

43

La differenza principale è il primo (una dichiarazione di funzione) è issata all'inizio della portata in cui è dichiarata, mentre il secondo (un'espressione di funzione) non è.

Questa è la ragione si è in grado di chiamare una funzione che è stata dichiarata dopo che si chiama:

testFunction(); 
function testFunction() {} 

Non si può fare che con un'espressione di funzione, in quanto l'assegnazione avviene sul posto:

testFunction(); 
var testFunction = function() {}; //TypeError 

C'è anche una terza forma (un nome funzione di espressione):

var testFunction = function myFunc() {}; 

In questo caso, l'identificatore myFunc è solo nell'ambito della funzione, mentre testFunction è disponibile in qualsiasi ambito dichiarato. MA (e c'è sempre un, ma quando si tratta di Internet Explorer) in IE sotto la versione 9 l'identificatore myFunc erroneamente fuori portata per l'ambito di contenimento. Le espressioni di funzione nominate sono utili quando è necessario fare riferimento alla funzione di chiamata (dal momento che arguments.callee è obsoleto).


Si noti inoltre che lo stesso vale per le dichiarazioni di variabili:

console.log(x); //undefined (not TypeError) 
var x = 10; 

Si può immaginare che il motore JavaScript interpreta il codice come questo:

var x; //Declaration is hoisted to top of scope, value is `undefined` 
console.log(x); 
x = 10; //Assignment happens where you expect it to 
+8

+1 *** Conoscenza *** Non sapevo che funzionasse così. Ho avuto problemi con 'var testFunction = function() {}' e non sapevo perché. Questo ha assolutamente senso. – iambriansreed

+0

IE9 ha corretto quell'errore, però, giusto? –

+0

@ ŠimeVidas - Giusto. Lo aggiungerò. –

Problemi correlati