229 votes

Uncaught TypeError: (valeur intermédiaire) (...) n'est pas une fonction

Tout fonctionne bien lorsque j'ai écrit la logique js dans une fermeture sous la forme d'un fichier js unique, comme suit:

 (function(win){
   //main logic here
   win.expose1 = ....
   win.expose2 = ....
})(window)
 

mais quand j'essaie d'insérer une fonction de journalisation alternative avant cette fermeture dans le même fichier js,

  window.Glog = function(msg){
     console.log(msg)
 }
 // this was added before the main closure.

 (function(win){
   //the former closure that contains the main javascript logic;
 })(window)
 

il se plaint qu'il y a un TypeError:

 Uncaught TypeError: (intermediate value)(...) is not a function
 

Qu'ai-je fait de mal?

434voto

Josh Crozier Points 30040

L'erreur est le résultat de la point-virgule manquant sur la troisième ligne:

window.Glog = function(msg) {
  console.log(msg);
}; // <--- Add this semicolon

(function(win) {
  // ...
})(window);

La spécification ECMAScript a des règles spécifiques pour le réglage automatique de point-virgule insertion, mais dans ce cas, un point-virgule n'est pas automatiquement inséré parce que le parenthesised expression qui commence sur la ligne suivante peut être interprété comme une liste d'arguments pour un appel de fonction.

Cela signifie que, sans que point-virgule, de l'anonyme window.Glog fonction a été invoquée avec une fonction comme l' msg paramètre, suivie par (window) qui a été par la suite tenter d'invoquer tout ce qui a été retourné.

C'est la façon dont le code a été interprétée:

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);

29voto

Nicholas Pipitone Points 2802

Pour faire le point-virgule règles simples

Chaque ligne commence avec un (, [, `, ou de n'importe quel opérateur (/, +, - sont les seuls valables), doit commencer par un point-virgule.

func()
;[0].concat(myarr).forEach(func)
;(myarr).forEach(func)
;`hello`.forEach(func)
;/hello/.exec(str)
;+0
;-0

Cela empêche une

func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0

monstrocity.

Note Supplémentaire

Parler de ce qui va arriver: crochets sera indice, les parenthèses seront traités comme des paramètres de la fonction. Le backtick se transformerait en étiqueté modèle, et regex ou explicitement entiers signés va se transformer en opérateurs. Bien sûr, vous pouvez simplement ajouter un point-virgule à la fin de chaque ligne. Il est bon de garder l'esprit lorsque vous êtes le prototypage rapide et de la suppression de vos points-virgules.

En outre, l'ajout des points-virgules à la fin de chaque ligne ne sera pas vous aider avec ce qui suit, donc garder à l'esprit des déclarations comme

return // Will automatically insert semicolon, and return undefined.
    (1+2);
i // Adds a semicolon
   ++ // But, if you really intended i++ here, your codebase needs help.

Le cas ci-dessus va arriver à revenir/continuer/pause/++/--. Tout linter va attraper cette morte-code ou ++/-- erreur de syntaxe (++/-- ne sera jamais réaliste de se produire).

Enfin, si vous voulez concaténation des fichiers de travail, assurez-vous que chaque fichier se termine par un point-virgule. Si vous utilisez un système de regroupement de programme (recommandé), il devrait le faire automatiquement.

11voto

ngCourse Points 654

Cas d'erreur:

 var userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
 

Sortie:

 TypeError: (intermediate value)(intermediate value) is not a function
 

Corrigé: Il manque un point-virgule (;) pour séparer les expressions

 userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}; // Without a semi colon, the error is produced

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
 

7voto

TIMINeutron Points 135

Pour moi, c'était beaucoup plus simple, mais il m'a fallu un certain temps pour le comprendre. Nous avions essentiellement dans notre .jslib

 some_array.forEach(item => {
    do_stuff(item);
});
 

Il s'avère qu'Unity (emscripten?) N'aime pas cette syntaxe. Nous l'avons remplacée par une bonne vieille boucle et elle a tout de suite cessé de se plaindre. Je déteste vraiment que cela ne montre pas la ligne dont il se plaint, mais de toute façon, me tromper deux fois honte sur moi.

5voto

ngCourse Points 654
   **Error Case:**

var handler = function(parameters) {
  console.log(parameters);
}

(function() {     //IIFE
 // some code
})();
 

Sortie: TypeError: (valeur intermédiaire) (valeur intermédiaire) n'est pas une fonction * Comment réparer IT -> car il vous manque semi colan (;) pour séparer les expressions;

  **Fixed**


var handler = function(parameters) {
  console.log(parameters);
}; // <--- Add this semicolon(if you miss that semi colan .. 
   //error will occurs )

(function() {     //IIFE
 // some code
})();
 

pourquoi cette erreur vient ?? Raison règles spécifiques pour l'insertion automatique du point-virgule auquel sont attribuées les normes ES6

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