web-dev-qa-db-fra.com

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, tel que:

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

83
armnotstrong

L'erreur résulte du 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 règles spécifiques pour l'insertion automatique du point-virgule ; toutefois, dans ce cas, un point-virgule n'est pas automatiquement inséré, car l'expression entre parenthèses commençant à la ligne suivante peut être interprétée comme une liste d'arguments pour un appel de fonction. .

Cela signifie que sans ce point-virgule, la fonction anonyme window.Glog était invoquée avec une fonction comme paramètre msg, suivie de (window) qui essayait par la suite d'appeler le résultat renvoyé.

Voici comment le code était interprété:

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

cas d'erreur:

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

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

Sortie:

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

Fix: Il vous 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;
5
ngCourse

Pour simplifier les règles de point-virgule

Chaque ligne commençant par (, [, `ou tout opérateur (/, +, - sont les seuls valides) 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 un

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

la monstruosité.

Remarque additionnelle

Pour mentionner ce qui va se passer: les crochets indexeront, les parenthèses seront traitées comme des paramètres de fonction. Le backtick se transformerait en tagged template , et les entiers regex ou explicitement signés se transformeraient 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 prototypez rapidement et supprimez vos points-virgules.

De plus, l'ajout de points-virgules à la fin de chaque ligne ne vous aidera pas dans les cas suivants, alors gardez à l'esprit les affirmations telles que

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 à retourner/continuer/break/++/-. Tous les linter verront cela avec un code mort ou une erreur de syntaxe ++/- (++/- ne se produira jamais de manière réaliste).

Enfin, si vous souhaitez que la concaténation de fichiers fonctionne, assurez-vous que chaque fichier se termine par un point-virgule. Si vous utilisez un programme de bundle (recommandé), vous devriez le faire automatiquement.

3
Nicholas Pipitone

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 cessé de se plaindre immédiatement. 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.

2
tfrascaroli

J'ai rencontré ce problème lorsque j'ai créé une nouvelle classe ES2015 dans laquelle le nom de la propriété était égal au nom de la méthode.

par exemple.:

class Test{
  constructor () {
    this.test = 'test'
  }

  test (test) {
    this.test = test
  }
}

let t = new Test()
t.test('new Test')

Veuillez noter que cette implémentation était dans NodeJS 6.10.

Pour contourner le problème (si vous ne souhaitez pas utiliser le nom de méthode ennuyeux 'setTest'), vous pouvez utiliser un préfixe pour vos propriétés 'privées' (comme _test).

Ouvrez vos outils de développement dans jsfiddle .

0
GuyT
  **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 un 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

0
ngCourse