TypeError: console.log (…) не является функцией

104

Я действительно не понимаю, как я могу получить 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);
            }
        }
    }
};
Цянь Чен
источник
Извините, изображение слишком маленькое. Пытаюсь понять, как заставить его показать исходный размер.
Цянь Чен
3
Пожалуйста, не используйте картинки для демонстрации кода и ошибок, это плохая практика.
Blubberguy22,

Ответы:

214

Решение

Просто поставьте точку с запятой ( ;) после console.log().


Объяснение

Ошибка легко воспроизводится следующим образом:

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

Он пытается передать в function(){}качестве аргумента возвращаемого значения из console.log()которых сами по себе не является функция , но на самом деле undefined(проверка typeof console.log();). Это потому, что JavaScript интерпретирует это как console.log()(function(){}). console.logОднако это функция.

Если бы у вас не было consoleобъекта, который вы бы увидели

ReferenceError: консоль не определена

Если бы у вас был consoleобъект, но не logметод, который вы бы увидели

TypeError: console.log не является функцией

Однако у вас есть

TypeError: console.log (...) не является функцией

Обратите внимание на (...)после имени функции. Это относится к возвращаемому значению функции.

Разрыв строки не разделяет эти два выражения как отдельные операторы из-за правил JavaScript для автоматической вставки точки с запятой (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.

user4642212
источник
8
Спасибо. Проблема решена добавлением точки с запятой. Какой тёмный уголок в javascript.
Цянь Чен
4
@ElgsQianChen: Одна из причин всегда использовать точку с запятой.
Felix Kling,
2
так это потому, что console.log()()его console.log(...)3 точки не являются ошибкой функции, иначе это должно быть просто console.logне функция (только если это не было, но на самом деле это так)
vinayakj
2
@vinayakj Совершенно верно. Если что-то не является функцией, то на эту функцию всегда ссылаются по ее имени, например object.method, если вы используете возвращаемое значение, особенно в цепном методе, так оно и будет object.method(...). Требуется некоторый опыт, чтобы знать, почему вы всегда должны использовать точки с запятой и как правильно интерпретировать сообщения об ошибках JavaScript.
user4642212
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

Одной из возможных причин может быть объявление var consoleгде-то в вашем скрипте.

Использование:

window.console.log(...);

вместо. Работал у меня.

Я надеюсь, что это помогает

Ученик
источник
У меня такая же проблема и работает global.console.log, почему это происходит? Как мне это исправить и использовать consol.log
Гутин
1

Есть еще один способ столкнуться с этой ошибкой. console.logне является неизменным, и значение можно случайно перезаписать.

console.log = 'hi';

В этом случае просто перезагрузите страницу, чтобы устранить повреждение.

Крейг Пембертон
источник
-1

Я знаю, что это не тот ответ, но подумал, что бросил бы следующий

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

У меня было текстовое поле на странице, которую я называл « консоль ». внезапно все мои скрипты console.log () выдали ошибку «Uncaught TypeError: console.log не является функцией объекта»

... и это правильно, потому что я использовал зарезервированное пространство имен для своего объекта / var. Я понял, что сделал после прочтения его поста и ради потомства: дважды проверял соглашения об именах.

ура

"это всегда человеческая ошибка"

Кристиан Жагарскас
источник
-1

По крайней мере, в react-native консоль, похоже, работает без какого-либо импорта, поэтому удаление import console = require('console');или import console from 'console';начало моего файла исправили это для меня. (кажется, что VS Code IDE иногда добавляет это автоматически)

Топ-Мастер
источник