Nicht erfasster TypeError: (Zwischenwert) (…) ist keine Funktion

128

Alles funktioniert gut, wenn ich die js-Logik in einem Abschluss als einzelne js-Datei geschrieben habe, als:

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

aber wenn ich versuche, eine alternative Protokollierungsfunktion vor diesem Schließen in dieselbe js-Datei einzufügen,

 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)

Es wird ein TypeError beanstandet:

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

Was habe ich falsch gemacht?

armnotstrong
quelle

Antworten:

275

Der Fehler ist auf das fehlende Semikolon in der dritten Zeile zurückzuführen:

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

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

Die ECMAScript-Spezifikation enthält spezielle Regeln für das automatische Einfügen von Semikolons. In diesem Fall wird ein Semikolon jedoch nicht automatisch eingefügt, da der in Klammern stehende Ausdruck, der in der nächsten Zeile beginnt, als Argumentliste für einen Funktionsaufruf interpretiert werden kann.

Dies bedeutet, dass ohne dieses Semikolon die anonyme window.GlogFunktion mit einer Funktion als msgParameter aufgerufen wurde , gefolgt von (window)dem Versuch, anschließend alles zurückzugeben, was zurückgegeben wurde.

So wurde der Code interpretiert:

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);
Josh Crozier
quelle
4
@ Armnotstrong Josh war schneller und die Antwort ist die gleiche :)
Mrlew
1
Danke mein Herr! Mein Linter hat das Semikolon automatisch entfernt und alles ist kaputt
gegangen
1
genial!!! Ich danke dir sehr!! Ich habe fast alle meine Haare auf diesem verloren ...
TMS
1
Das, mein Freund, ist Gold!
LihO
1
Das ist verrückt und ich bin so dankbar für diesen Beitrag. Ich habe den Status nach einer ifAnweisung in einer React- useEffect()Funktion festgelegt, als ich immer wieder den Fehler "... ist keine Funktion" erhielt.
Rahul Nath
7

Semikolonregeln vereinfachen

Jede Zeile , die mit einem beginnt (, [`, oder jeder Operator (/, +, - ist die einzige gültigen ist), muss mit einem Semikolon beginnen.

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

Dies verhindert a

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

Monstrocity.

Zusätzliche Anmerkung

Um zu erwähnen, was passieren wird: Klammern werden indiziert, Klammern werden als Funktionsparameter behandelt. Der Backtick würde sich in eine mit Tags versehene Vorlage verwandeln , und Regex oder explizit signierte Ganzzahlen werden zu Operatoren. Natürlich können Sie am Ende jeder Zeile einfach ein Semikolon einfügen. Es ist jedoch gut, sich vor Augen zu halten, wenn Sie schnell Prototypen erstellen und Ihre Semikolons ablegen.

Das Hinzufügen von Semikolons am Ende jeder Zeile hilft Ihnen nicht bei den folgenden Punkten. Denken Sie also an Aussagen wie

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.

Der obige Fall wird zufällig / continue / break / ++ / - zurückgeben. Jeder Linter wird dies mit einem Dead-Code- oder ++ / - Syntaxfehler abfangen (++ / - wird niemals realistisch auftreten).

Wenn die Dateikettung funktionieren soll, stellen Sie sicher, dass jede Datei mit einem Semikolon endet. Wenn Sie ein Bundler-Programm verwenden (empfohlen), sollte dies automatisch erfolgen.

Nicholas Pipitone
quelle
5

Fehlerfall:

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

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

Ausgabe:

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

Fix: Ihnen fehlt ein Semikolon (;), um die Ausdrücke zu trennen

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

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;
Shashwat Gupta
quelle
3

Für mich war es viel einfacher, aber ich brauchte eine Weile, um es herauszufinden. Wir hatten im Grunde in unserer .jslib

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

Es stellt sich heraus, dass Unity (emscripten?) Diese Syntax einfach nicht mag. Wir haben es durch eine gute alte for-Schleife ersetzt und es hat sofort aufgehört, sich zu beschweren. Ich hasse es wirklich, dass es nicht die Linie zeigt, über die es sich beschwert, aber trotzdem, täusche mich zweimal, schäme mich.

tfrascaroli
quelle
meine Vermutung ist , dass Ihr Problem etwas mit dem zu tun war dies
Brandito
Dies ist ein anderer Fall als die Frage.
CherryDT
@CherryDT ist es nicht, da der Fehler, den ich bekam, genau der gleiche war.
Tfrascaroli
Nein, bei dieser Frage handelt es sich um Fehler, die beim versehentlichen Aufrufen einer Funktion auftreten, da zwischen der Anweisung und a (in der nächsten Zeile kein Semikolon vorhanden ist . Ich sehe nichts davon in Ihrem Fall. Die Frage besteht nicht nur aus dem Titel!
CherryDT
1

Dieses Problem trat auf, als ich eine neue ES2015-Klasse erstellte, bei der der Eigenschaftsname dem Methodennamen entsprach.

z.B:

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

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

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

Bitte beachten Sie, dass diese Implementierung in NodeJS 6.10 war.

Als Problemumgehung (wenn Sie den langweiligen Methodennamen 'setTest' nicht verwenden möchten) können Sie ein Präfix für Ihre 'privaten' Eigenschaften (wie _test) verwenden.

Öffnen Sie Ihre Entwicklertools in jsfiddle .

GuyT
quelle
Dies ist ein anderer Fall als die Frage.
CherryDT
0
  **Error Case:**

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

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

Ausgabe: TypeError: (Zwischenwert) (Zwischenwert) ist keine Funktion * So beheben Sie IT -> weil Ihnen Semikolan (;) fehlt, um Ausdrücke zu trennen;

 **Fixed**


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

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

Warum kommt dieser Fehler? Grund: Spezifische Regeln für das automatische Einfügen von Semikolons, die mit ES6-Standards versehen sind

Shashwat Gupta
quelle
0

Wenn ich eine Stammklasse erstelle, deren Methoden ich mit den Pfeilfunktionen definiert habe. Beim Erben und Überschreiben der ursprünglichen Funktion ist mir dasselbe Problem aufgefallen.

class C {
  x = () => 1; 
 };
 
class CC extends C {
  x = (foo) =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));

Dies wird gelöst, indem die Methode der übergeordneten Klasse ohne Pfeilfunktionen definiert wird

class C {
  x() { 
    return 1; 
  }; 
 };
 
class CC extends C {
  x = foo =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));
Lourdes Vílchez
quelle