110 votes

Javascript "Uncaught TypeError: l'objet n'est pas une fonction" question sur l'associativité

Le Code est comme suit:

<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>

Cela va lancer un "Uncaught TypeError: object n'est pas une fonction". Si j'enveloppe anonyme appel de fonction/invocation dans un autre jeu de parenthèses il va lancer l'alerte, mais encore donner moi une erreur. Si j'ai mis un point-virgule après le "var postTypes" définition alors il sera tout à fait bien.

J'ai été amené à croire que le javascript n'exige pas des points-virgules, donc je fais une supposition qu'il y a de bizarre associativité des règles de la fonction de l'application que je ne suis pas entièrement comprendre. J'espère que quelqu'un peut me donner la réponse à pourquoi j'obtiens cette erreur.

Merci.

93voto

KennyTM Points 232647

Javascript ne nécessitent des points-virgules, c'est juste que l'interprète va l'insérer pour vous sur la ligne des pauses lorsque le code devient la syntaxe erreur sans elle*.

Malheureusement, le code

var a = new B(args)(stuff)()

est pas une erreur de syntaxe, donc pas de ; sera inséré. (Un exemple qui peut exécuter est

var answer = new Function("x", "return x")(function(){return 42;})();

)

Pour éviter les mauvaises surprises comme cela, entraînez-vous à toujours mettre fin à un énoncé avec ;.

(*: À seulement un pouce de la règle. Pas toujours vrai. L'insertion de la règle est beaucoup plus compliqué. Cette page de blog à propos de point-virgule insertion a plus de détails.)

19voto

CMS Points 315406

Votre code rencontre un cas où le processus d' insertion automatique de point-virgule (ASI) ne se produit pas.

Vous ne devez jamais vous fier à ASI, vous devez utiliser des points-virgules pour séparer correctement les instructions:

 var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!

(function() { alert('hello there') })();
 

Votre code avant essayait en réalité d'appeler l'objet tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X