1. ホーム
  2. javascript

[解決済み] TypeError: console.log(...) は関数ではありません。

2022-02-02 20:45:34

質問

1091行目のconsole.logが関数でないことをどうすれば理解できるのか、とても困っています。以下のクロージャを削除すると、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);
            }
        }
    }
};

解決方法は?

解決方法

単純にセミコロン( ; の後に console.log( ... ) .


説明

このように簡単にエラーを再現することができます。

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

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

がなかったら console オブジェクトが表示されます。

ReferenceError: console is not defined

もし、あなたが console オブジェクトは存在するが log メソッドが表示されます。

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

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

TypeError: console.log(...) is not a function.

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

改行の は、この二つの式を分離しません。 を別のステートメントとして使用することはできません。 セミコロン自動挿入(ASI)の規則 .


を尊重します。 ;

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

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 .