Il codice è il seguente:
<body>
<a href="javascript:;" id="test">hello</a>
</body>
<script type="text/javascript">
document.getElementById("test").addEventListener("click", function () {
test()
}, false)
function test() {
var postTypes = new Array('hello', 'there')
(function() { alert('hello there') })()
}
</script>
Questo lancerà un:
"Uncaught TypeError: object is not a function"
Se avvolgo la chiamata/invocazione della funzione anonima in un altro set di parentesi, eseguirà l'avviso, ma mi darà ancora un errore. Se metto un punto e virgola dopo la definizione "var postTypes" allora andrà completamente bene.
Sono stato portato a credere che javascript non richiede punti e virgola, quindi sto ipotizzando che ci sia qualche strana regola di associatività nell'applicazione delle funzioni che non sto comprendendo appieno. Perché sto ricevendo questo errore?
Javascript richiede i punti e virgola, è solo che l'interprete li inserisce per voi sulle interruzioni di riga quando il codice diventa un errore di sintassi senza di esso*.
Sfortunatamente, il codice
var a = new B(args)(stuff)()
non è non un errore di sintassi, quindi nessun ;
verrà inserito. (Un esempio che può essere eseguito è
var answer = new Function("x", "return x")(function(){return 42;})();
Per evitare sorprese come questa, allenatevi a terminare sempre una dichiarazione con ;
.
(*: Solo una regola del pollice. Non sempre è vero. La regola di inserimento è molto più complicata. Questa pagina del blog sull'inserimento del punto e virgola è più dettagliata).
Il tuo codice sperimenta un caso in cui il processo Automatic Semicolon Insertion (ASI) non avviene.
Non dovreste mai fare affidamento sull'ASI. Dovresti usare il punto e virgola per separare correttamente le dichiarazioni:
var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!
(function() { alert('hello there') })();
Il tuo codice stava effettivamente cercando di invocare l'oggetto array.
Ho avuto un errore simile e mi ci è voluto un po' per capire che nel mio caso ho chiamato la variabile array payInvoices e la funzione anche payInvoices. Questo ha confuso AngularJs. Una volta che ho cambiato il nome in processPayments() ha finalmente funzionato. Volevo solo condividere questo errore e la soluzione perché mi ci è voluto molto tempo per capirlo.