TypeError:console.log(…)は関数ではありません


97

どのようにしてconsole.logを取得することができるのか本当に混乱しています。1091行目の関数ではありません。以下のクロージャーを削除しても、1091行目はそのようなエラーを報告しません。Chromeバージョン43.0.2357.130(64ビット)。

ここに画像の説明を入力してください

これがコードです:

$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);
            }
        }
    }
};

画像のサイズが小さすぎるようです。元のサイズを表示する方法を考えています。
銭チェン

2
コードとエラーを示すために画像を使用しないでください。これは悪い習慣です。
Blubberguy22 2015年

回答:


201

解決

セミコロン(;)をconsole.log(…の後に置くだけです)


説明

エラーは次のように簡単に再現できます。

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

それ自体が関数ではなく、実際に戻り値戻り値function(){}引数として渡そうとしています(チェック)。これは、JavaScriptがこれをと解釈するためです。しかし、ある関数が。console.log()undefinedtypeof console.log();console.log()(function(){})console.log

consoleあなたが見るオブジェクトを持っていなかった場合

ReferenceError:コンソールが定義されていません

あなたがconsoleオブジェクトを持っていて、logあなたが見るメソッドを持っていなかった場合

TypeError:console.logは関数ではありません

しかし、あなたが持っているのは

TypeError:console.log(...)は関数ではありません

(...)関数名の後に注意してください。これらでは、関数の戻り値を参照しています。

JavaScriptの自動セミコロン挿入(ASI)ルールにより、改行はこれら2つの式を個別のステートメントとして分離しません


尊重する ;

これらのコードスニペットはすべて、セミコロンが存在しない場合、あらゆる種類の予期しないエラーを引き起こします。

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

もう一つの例

(...)連鎖メソッドまたは連鎖プロパティアクセサーを使用すると、次のようなことがよくあります。

string.match(/someRegEx/)[0]

そのRegExが見つからない場合、メソッドが返さnullれ、プロパティアクセサーがオンnullになりTypeError: string.match(...) is null 、戻り値はになりnullます。以下の場合、戻り値でした。console.log(...)undefined


8
ありがとう。セミコロンを追加することで解決しました。JavaScriptでなんて暗いコーナーだ。
Qian Chen

4
@ElgsQianChen:常にセミコロンを使用する1つの理由。
Felix Kling 2015年

2
ので、それをあるconsole.log()()そのconsole.log(...)3個のドットではない関数エラーが、それ以外の場合がされてなければならないが、単なるconsole.log関数ではありません(それは波平場合にのみ、実際にそれがある)
vinayakjは

2
@vinayakjその通りです。何かが関数ではない場合、その関数は常にその関数名で参照されobject.methodます。たとえば、特に連鎖メソッドで戻り値を使用している場合は、その関数はになりますobject.method(...)。それはちょっとあなたが常にセミコロンを使うべき理由を知るために経験をとり、そしてどのように正しくJavaScriptのエラーメッセージを解釈します。
user4642212 2015年

2
このような問題があるため、IIFEの前に常にセミコロンを付けることをお勧めします。そうすれば、移動しても、他の場所にあるセミコロンを壊す危険がなくなります。さらに、縮小/バンドル中に状況がおかしくなった場合は、より安全です。
マリー

5

エラーは、の戻り値console.log()関数ではないことを意味します。セミコロンがありません:

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

これにより、以下(...)のIIFEが関数呼び出しとして解釈されます。


のエラーメッセージを比較する

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

そして

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

5

2020年の更新

考えられる原因の1つvar consoleは、スクリプト内のどこかでの宣言です。

使用する:

window.console.log(...);

代わりに。私のために働いた。

それが役に立てば幸い


同じ問題があり、global.console.logが機能しますが、なぜこれが起こっているのですか?どのように修正し、consol.logを使用しますか
Gutyn

1

このエラーが発生する別の方法があります。console.logは不変ではなく、誤って値を上書きする可能性があります。

console.log = 'hi';

この場合、ページをリロードして、ダメージを元に戻します。


-1

これが「THE」の答えではないことはわかっていますが、次のように投げると思いました

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

コンソール」と呼んでいたページにテキストエリアがありました。突然、すべてのconsole.log()スクリプトがエラー「Uncaught TypeError:console.log is not a function at Object」を出しました

...そして当然のことながら、私は自分のオブジェクト/変数に予約済みの名前空間を使用しました。私は彼の投稿を読んだ後に何をしたか、そして後世のために、命名規則をダブルチェックすることに気付きました。

乾杯

「常に人的ミス」


-1

少なくとも反応ネイティブでは、コンソールはインポートなしで動作するように見えるので、ファイルの最初から削除するimport console = require('console');import console from 'console';、ファイルを修正してくれました。(VS Code IDEは自動的に追加するようです)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.