TypeError: console.log (…) ist keine Funktion

96

Ich bin wirklich verwirrt, wie ich console.log erhalten kann. Log ist keine Funktion in Zeile 1091. Wenn ich den Verschluss unten entferne, beschwert sich Zeile 1091 nicht über einen solchen Fehler. Chrome Version 43.0.2357.130 (64-Bit).

Geben Sie hier die Bildbeschreibung ein

Hier ist der Code:

$scope.columnNameChanged = function (tableColumn) {
    setDirtyColumn(tableColumn);
    //propagate changes to the key fields
    for (var i = 0; i < $scope.tableIndexes.length; ++i) {
        for (var j = 0; j < $scope.tableIndexes[i].columnName.length; ++j) {
            if ($scope.tableIndexes[i].columnName[j] === tableColumn.previousName) {
                console.log('xxx', $scope.tableIndexes[i].columnName[j])
                (function (i, j) {
                    $timeout(function () {
                        console.log($scope.tableIndexes[i].columnName[j])
                        $scope.tableIndexes[i].columnName[j] = tableColumn.name.toUpperCase();
                        console.log($scope.tableIndexes[i].columnName[j])
                    });
                })(i, j);
            }
        }
    }
};
Qian Chen
quelle
Entschuldigung, das Bild scheint zu klein zu sein. Ich versuche herauszufinden, wie ich die Originalgröße anzeigen kann.
Qian Chen
2
Bitte verwenden Sie keine Bilder, um Ihren Code und Fehler anzuzeigen. Dies ist eine schlechte Praxis.
Blubberguy22

Antworten:

195

Lösung

Setzen Sie einfach ein Semikolon ( ;) nach console.log().


Erläuterung

Der Fehler ist so leicht reproduzierbar:

console.log()
(function(){})

Es wird versucht, function(){}als Argument an den Rückgabewert zu übergeben, console.log()dessen Funktion selbst keine Funktion ist, sondern tatsächlich undefined(check typeof console.log();). Dies liegt daran, dass JavaScript dies als interpretiert console.log()(function(){}). console.logjedoch ist eine Funktion.

Wenn Sie das consoleObjekt nicht hätten , würden Sie sehen

ReferenceError: Konsole ist nicht definiert

Wenn Sie das consoleObjekt hätten, aber nicht die logMethode, die Sie sehen würden

TypeError: console.log ist keine Funktion

Was Sie jedoch haben, ist

TypeError: console.log (...) ist keine Funktion

Beachten Sie den (...)nach dem Funktionsnamen. Bei diesen bezieht es sich auf den Rückgabewert der Funktion.

Der Zeilenumbruch trennt diese beiden Ausdrücke aufgrund der JavaScript- Regeln für das automatische Einfügen von Semikolons (ASI) nicht als separate Anweisungen .


Respektiere die ;

Alle diese Codefragmente führen zu allen möglichen unerwarteten Fehlern, wenn keine Semikolons vorhanden sind:

console.log() // As covered before
() // TypeError: console.log(...) is not a function
console.log() // Accessing property 0 of property 1 of the return value…
[1][0] // TypeError: console.log(...) is undefined
console.log() // Like undefined-3
-3 // NaN
let a, b;
const array = Array.from({ length: 2 })

// Now, let’s use destructuring:
[a, b] = array; // ReferenceError: can't access lexical declaration 'array' before initialization
let a, b;
const array = Array.from({ length: 2 }).fill(1),
  array2 = Array.from({ length: 2 })

// Now, let’s use destructuring. Attempt to get the two 1’s from `array` as `a` and `b`:
[a, b] = array;
console.log(a, b); // undefined undefined

Ein anderes Beispiel

Sie sehen dies häufig (...)bei Verwendung von verketteten Methoden oder verketteten Eigenschaftszugriffsberechtigten:

string.match(/someRegEx/)[0]

Wenn diese RegEx nicht gefunden wird, gibt die Methode zurück nullund der Eigenschaft-Accessor on nullverursacht a TypeError: string.match(...) is null - der Rückgabewert ist null. Im Fall von console.log(...)dem Rückgabewert war undefined.

user4642212
quelle
8
Vielen Dank. Problem durch Hinzufügen eines Semikolons gelöst. Was für eine dunkle Ecke im Javascript.
Qian Chen
4
@ElgsQianChen: Ein Grund, immer Semikolons zu verwenden.
Felix Kling
2
so ist es, weil console.log()()seine console.log(...)3 Punkte kein Funktionsfehler sind, sonst sollte es einfach console.lognicht funktionieren (nur wenn es nicht war, aber tatsächlich ist es)
vinayakj
2
@vinayakj Genau. Wenn etwas keine Funktion ist, wird auf diese Funktion immer mit ihrem Funktionsnamen verwiesen, z. B. object.methodwenn Sie den Rückgabewert verwenden, insbesondere in einer verketteten Methode, wird dies der Fall sein object.method(...). Man muss wissen, warum man immer Semikolons verwenden sollte und wie man JavaScript-Fehlermeldungen richtig interpretiert.
user4642212
2
Aufgrund solcher Probleme wird manchmal empfohlen, IIFEs immer ein Semikolon voranzustellen. Auf diese Weise besteht keine Gefahr, dass ein fehlendes Semikolon an anderer Stelle beschädigt wird, wenn Sie es verschieben. Außerdem wäre es sicherer, wenn die Dinge während der Minimierung / Bündelung merkwürdig werden.
Marie
5

Der Fehler bedeutet, dass der Rückgabewert von console.log()keine Funktion ist. Ihnen fehlt ein Semikolon:

console.log('xxx', $scope.tableIndexes[i].columnName[j]);
//                                                      ^

(...)Dadurch wird das Folgende des IIFE als Funktionsaufruf interpretiert.


Vergleichen Sie die Fehlermeldungen von

> var foo = {bar: undefined};
> foo.bar();
Uncaught TypeError: foo.bar is not a function

und

> var foo = {bar: function(){}};
> foo.bar()();
Uncaught TypeError: foo.bar(...) is not a function
Felix Kling
quelle
5

2020 Update

Eine mögliche Ursache kann die Deklaration var consoleirgendwo in Ihrem Skript sein.

Verwenden:

window.console.log(...);

stattdessen. Hat für mich gearbeitet.

Ich hoffe, es hilft

Lerner
quelle
Ich habe das gleiche Problem und global.console.log funktioniert. Warum passiert das? Wie behebe ich es und benutze das consol.log
Gutyn
1

Es gibt eine andere Möglichkeit, diesen Fehler zu finden. console.logist nicht unveränderlich und es ist möglich, den Wert versehentlich zu überschreiben.

console.log = 'hi';

In diesem Fall laden Sie die Seite einfach neu, um den Schaden rückgängig zu machen.

Craig Pemberton
quelle
-1

Ich weiß, dass dies nicht "DIE" Antwort ist, dachte aber, ich würde im Folgenden werfen

 var console = $( data.message_target );
 console.val( console.val() + data.message); 
 console.scrollTop(console[0].scrollHeight - console.height());

Ich hatte einen Textbereich auf der Seite, die ich " Konsole " nannte. Plötzlich gaben alle meine console.log () - Skripte den Fehler "Uncaught TypeError: console.log ist keine Funktion bei Object".

... und das zu Recht, weil ich für mein Objekt / var einen reservierten Namespace verwendet habe. Ich erkannte, was ich getan hatte, nachdem ich seinen Beitrag gelesen hatte, und der Nachwelt zuliebe: Namenskonventionen überprüfen.

Prost

"Es ist immer menschliches Versagen"

Christian Žagarskas
quelle
-1

Zumindest in React-Native scheint die Konsole ohne Import zu funktionieren. Durch Entfernen import console = require('console');oder import console from 'console';Anfang meiner Datei wurde dies für mich behoben. (Die VS-Code-IDE scheint dies manchmal automatisch hinzuzufügen.)

Top-Master
quelle