dichiarazione di funzione regolare è simile al seguente:
function FuncName() { doSomething(); }
Poi si può chiamare questa funzione in questo modo: le funzioni
FuncName();
anonimi sono molto simili:
var FuncName = function YouCanEvenPutANameHereAndItWillBeIgnored() { doSomething(); }
Se la sintassi per le funzioni regolari e le funzioni anonime è identico, allora come fa JS a distinguerle? Deduce cosa intendi dal contesto. Ecco perché questa espressione funzione richiamata all'istante non funziona:
function(s) { console.log(s); } ('abc');
Il parser JS lo legge da sinistra.La linea inizia con function
, quindi JS indovina è una dichiarazione di funzione regolare e si aspetta che termini con }
. C'è comunque ('abc')
dopo la funzione, e JS genera un errore.
Per risolvere il problema, è necessario ingannare JS per analizzare tale funzione come funzione anonima. Per farlo devi renderlo parte di un'espressione. Il modo più popolare è questo:
(function(s) { console.log(s); }) ('abc');
Ci sono altri modi, però. Sono meno leggibili, ma funzionano anche loro.
(function(s) { console.log(s); } ('abc'));
+function(s) { console.log(s); } ('abc');
-function(s) { console.log(s); } ('abc');
1 * function(s) { console.log(s); } ('abc');
Nel tuo caso la funzione è già una parte di un'espressione, quindi non c'è bisogno di aggiungere parentesi.
Si noti che esistono altri modi per far sì che una funzione sia un'espressione. Ad esempio: '! Function() {}()' o '0/function() {}()' o il mio preferito '-function() {}()' – slebetman
Vedi anche [perché le parentesi sono necessarie] (http : //stackoverflow.com/q/1634268/1048572) in altri luoghi. – Bergi