Помилка типу: console.log (…) не є функцією


100

Мене дуже бентежить, як я можу отримати 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

Відповіді:


203

Рішення

Просто поставте крапку з комою ( ;) після console.log().


Пояснення

Помилка легко відтворюється наступним чином:

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

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

Якби у вас не було consoleоб’єкта, який би ви побачили

ReferenceError: консоль не визначена

Якби у вас був consoleоб’єкт, але не той logметод, який ви б бачили

Помилка типу: console.log не є функцією

Однак те, що у вас є

Помилка типу: 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.


8
Дякую. Проблема вирішена додаванням крапки з комою. Який темний куточок у javascript.
Цянь Чень,

4
@ElgsQianChen: Одна з причин завжди використовувати крапки з комою.
Фелікс Клінг,

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 не є функцією в Object"

... і це правильно, тому що я використовував зарезервований простір імен для мого об’єкта / вар. Я зрозумів, що зробив, прочитавши його допис, і заради нащадків: подвійну перевірку конвенцій щодо імен.

ура

"його завжди людська помилка"


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.