Le code est le suivant :
<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>
Ceci lancera un :
"Uncaught TypeError : object is not a function" ;
Si j'enveloppe l'appel ou l'invocation de la fonction anonyme dans une autre série de parenthèses, l'alerte sera exécutée, mais je recevrai toujours une erreur. Si je mets un point-virgule après la définition de "var postTypes" ; alors tout ira bien.
J’ai été amené à croire que javascript n’exige pas de point-virgule, je suppose donc qu’il existe des règles d’associativité bizarres dans l’application des fonctions que je ne comprends pas complètement. Pourquoi est-ce que je reçois cette erreur ?
Javascript requiert des points-virgules, c’est juste que l’interprète les insère pour vous sur les sauts de ligne lorsque le code devient une erreur de syntaxe sans eux*.
Malheureusement, le code
var a = new B(args)(stuff)()
n'est pas une erreur de syntaxe, donc aucun ;
ne sera inséré. (Un exemple qui peut s'exécuter est
var answer = new Function("x", "return x")(function(){return 42;})();
Pour éviter ce genre de surprises, entraînez-vous à toujours terminer une déclaration par ;
.
(* : Juste une règle empirique. Pas toujours vraie. La règle d'insertion est beaucoup plus compliquée. Cette page du [blog] (http://inimino.org/~inimino/blog/javascript_semicolons) sur l'insertion du point-virgule est plus détaillée).
Votre code présente un cas où le processus d'[Insertion automatique du point-virgule][1] (ASI) ne se produit pas.
Vous ne devez jamais vous fier à l'ASI. Vous devez utiliser les points-virgules pour séparer correctement les instructions :
var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!
(function() { alert('hello there') })();
Votre code essayait en fait d'invoquer l'objet array.
J'ai eu une erreur similaire et il m'a fallu un certain temps pour réaliser que dans mon cas, j'ai nommé la variable tableau payInvoices et la fonction payInvoices également. Cela a perturbé AngularJs. Une fois que j'ai changé le nom en processPayments(), cela a finalement fonctionné. Je voulais juste partager cette erreur et la solution car il m'a fallu beaucoup de temps pour comprendre.