2012-12-23 15 views
5

Eventuali duplicati:
Difference between (function(){})(); and function(){}();
Are “(function () { }) ()” and “(function () { } ())” functionally equal in JavaScript?JavaScript funzioni di auto-invocando

Mi chiedevo solo se v'è una differenza (per quanto riguarda la funzionalità) tra questi due esempi:

1st

(function foo() { 
console.log("bar") 
})() 

secondo

(function foo() { 
console.log("bar") 
}()) 

Entrambi sembrano funzionare bene ...

Grazie!

+2

Nessuna differenza. – Dogbert

risposta

4

Sono esattamente gli stessi. Non c'è alcuna differenza tra i due in termini di efficienza, produzione o utilizzo. L'utilizzo di entrambi è una questione di preferenza.

Sebbene vi sia una variazione più breve delle due forme comunemente utilizzate dai minifattori JS. Cioè, logica NOT -ing l'espressione di una funzione e chiamarlo:

!function() { 
    console.log(x); 
}();​ 
+0

Ok, grazie! :) – LSFR77

10

Nessuna differenza. In realtà, è necessario utilizzare () solo perché pianura ...

function() { console.log('bar'); }(); 

... non saranno riconosciuti correttamente da JS parser. Come detto nella ES5 standard:

Inoltre, un ExpressionStatement non può iniziare con la funzione di parola perché potrebbe rendere ambigua con un FunctionDeclaration.

La soluzione alternativa (a (...)) sta aumentando questa dichiarazione con un operatore unario. Entrambi ...

+function() { console.log('bar'); }(); 

... e ...

!function() { console.log('bar'); }(); 

... funzionerà.

+0

Grazie per la tua risposta! – LSFR77

2

Non c'è differenza tra loro. Entrambi sono immediately invoked function expressions. Alcune persone come Douglas Crockford preferiscono lo second method. Alcuni preferiscono il primo. È interessante notare che il JSLint di Crockford non consente il primo metodo, quindi presumo che il secondo sia più comune.

Oh, e se si utilizza una dichiarazione di funzione anziché un'espressione di funzione, è possibile chiamare la funzione prima che appaia nel programma.Questo perché le dichiarazioni vengono issate in JavaScript:

greet(); // This will work 

function greet() { 
    alert("Merry Christmas!"); 
} 

Lo stesso non vale per le espressioni di funzione:

greet(); // This will not work 

var greet = function greet() { 
    alert("Merry Christmas!"); 
}; 

che è praticamente tutto quello che dovete sapere per ora.

+0

'function greet()', sebbene valida, non ha senso. Solo 'var greet = function()' è tutto ciò che serve. – ErikE

+0

@ErikE - Non ha senso come in? Ha perfettamente senso per me. –

+0

Qual è il punto di un nome che non può essere utilizzato? Ha molto senso come 'function() {var greet; } 'se greet non viene mai usato. – ErikE