Uncaught TypeError: (Zwischenwert)(…) ist keine Funktion

Lesezeit: 5 Minuten

Alles funktioniert gut, wenn ich die js-Logik in einer Closure 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 dieser Schließung 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 beschwert sich, dass ein TypeError vorliegt:

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

Was habe ich falsch gemacht?

  • Beantwortet das deine Frage? TypeError: console.log(…) ist keine Funktion

    – Sebastian Simon

    15. Juni ’21 um 12:00

Uncaught TypeError Zwischenwert ist keine Funktion
Josh Crozier

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 hat spezifische Regeln für das automatische Einfügen von Semikolon, jedoch wird in diesem Fall kein Semikolon automatisch eingefügt, da der in der nächsten Zeile beginnende eingeklammerte Ausdruck als Argumentliste für einen Funktionsaufruf interpretiert werden kann.

Dies bedeutet, dass ohne dieses Semikolon das anonyme window.Glog Die Funktion wurde mit einer Funktion aufgerufen, die als msg Parameter, gefolgt von (window) die anschließend versuchte, das, was zurückgegeben wurde, aufzurufen.

So wurde der Code interpretiert:

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

  • @armnotstrong Josh war schneller und die Antwort ist dieselbe 🙂

    – mrlew

    4. Februar ’17 um 4:28

  • Danke mein Herr! Mein Linter hat das Semikolon automatisch entfernt und alles ist kaputt 🙂

    – Jonas Lomholdt

    26. September ’17 um 12:44 Uhr

  • genial!!! Ich danke dir sehr!! Ich habe hier fast alle meine Haare verloren…

    – Tomas

    9. Juni ’18 um 18:44

  • Das, mein Freund, ist Gold!

    – LihO

    30. Okt ’18 um 13:33

  • Das ist verrückt und ich bin so dankbar für diesen Beitrag. Ich habe den Zustand nach einem eingestellt if Aussage in einem React useEffect() Funktion, wenn ich diesen Fehler “… is not a function” erhalten habe.

    – Rahul Nath

    29. Mai ’20 um 21:25

1642053554 992 Uncaught TypeError Zwischenwert ist keine Funktion
Nicholas Pipitone

Um Semikolon-Regeln einfach zu machen

Jede Zeile, die mit a beginnt (, [, `, or any arithmetic operator, must begin with a semicolon if you want it to be interpreted as its own line ~ Otherwise, it may combine with the previous line by accident. All other line breaks have implicit semicolons.

That’s it. Done.

  • Note that /, +, – are the only valid operators you would want to do this for anyway. You would never want a line to begin with ‘*’, since it’s a binary operator that could never make sense at the beginning of a line.

Why?

Consider the following:

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

Das Befolgen der obigen Regeln verhindert, dass das Obige als interpretiert wird

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

Zusätzliche Bemerkungen

Um zu erwähnen, was passieren wird: Klammern werden indiziert, Klammern werden als Funktionsparameter behandelt. Der Backtick würde sich in a transform verwandeln getaggte Vorlage, Regex wird in Division umgewandelt und explizit +/- vorzeichenbehaftete Ganzzahlen werden in Plus/Minus-Operatoren umgewandelt.

Natürlich können Sie dies vermeiden, indem Sie einfach ein Semikolon am Ende jedes Zeilenumbruchs hinzufügen, aber glauben Sie nicht, dass Sie dadurch wie ein C-Programmierer programmieren können. Seit wann du nicht eine Zeile mit einem Semikolon beenden, könnte Javascript entgegen Ihren Wünschen implizit in Ihrem Namen eins hinzufügen. Denken Sie also an Aussagen wie

return       // Implicit semicolon, will return undefined.
    (1+2);

i        // Implicit semicolon on this line
   ++;   // But, if you really intended "i++;"
         // and you wrote it like this,
         // you need help.

Der obige Fall wird zurückkehren/weiter/unterbrechen/++/–. Jeder Linter wird dies mit totem Code oder ++/– Syntaxfehlern abfangen (++/– wird realistischerweise nie passieren).

Wenn Sie schließlich möchten, dass die Dateiverkettung funktioniert, stellen Sie sicher, dass jede Datei mit einem Semikolon endet. Wenn Sie ein Bundle-Programm verwenden (empfohlen), sollte dies automatisch erfolgen.

Uncaught TypeError Zwischenwert ist keine Funktion
Shashwat Gupta

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;

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

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

Es stellte 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 egal, täusche mich zweimal, Schande über mich.

Wenn ich eine Root-Klasse erstelle, deren Methoden ich mit den Pfeilfunktionen definiert habe. Beim Vererben und Überschreiben der ursprünglichen Funktion ist mir das gleiche 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 Elternklasse 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));

  • Function.bind erfordert diese Strategie auch – danke

    – jimmont

    26. Januar ’21 um 10:54

1642053554 105 Uncaught TypeError Zwischenwert ist keine Funktion
AmerllicA

Ich hatte das gleiche Problem mit dieser Situation:

let brand, capacity, color;
let car = {
  brand: 'benz',
  capacity: 80,
  color: 'yellow',
}

({ color, capacity, brand } = car);

Und mit nur einem ; am Ende von car Deklaration des Fehlers:

let car = {
  brand: 'benz',
  capacity: 80,
  color: 'yellow',
}; // <-------------- here a semicolon is needed

Eigentlich vorher ({ color, capacity, brand } = car); es wird benötigt, um ein Semikolon zu sehen.

  • Function.bind erfordert diese Strategie auch – danke

    – jimmont

    26. Januar ’21 um 10:54

  **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 Semikolan(;) fehlen, 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 :
spezielle Regeln für die automatische Semikolon-Einfügung, die den ES6-Standards entspricht

.

482410cookie-checkUncaught TypeError: (Zwischenwert)(…) ist keine Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy