TypeError: console.log (…) nie jest funkcją


103

Jestem naprawdę zdezorientowany, jak mogę uzyskać console.log nie jest funkcją w linii 1091. Jeśli usunę poniższe zamknięcie, linia 1091 nie narzeka na taki błąd. Wersja Chrome 43.0.2357.130 (64-bitowa).

wprowadź opis obrazu tutaj

Oto kod:

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

Przepraszamy, obraz wydaje się być za mały. Próbuję wymyślić, jak sprawić, by pokazywał oryginalny rozmiar.
Qian Chen

3
Nie używaj zdjęć do pokazania kodu i błędów, to zła praktyka.
Blubberguy 22

Odpowiedzi:


213

Rozwiązanie

Po prostu wstaw średnik ( ;) po console.log().


Wyjaśnienie

Błąd można łatwo odtworzyć w następujący sposób:

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

To stara się przekazać function(){}jako argument do wartości zwracanej z console.log()która sama nie jest funkcją, ale faktycznie undefined(check typeof console.log();). Dzieje się tak, ponieważ JavaScript interpretuje to jako console.log()(function(){}). console.logjednak jest funkcją.

Gdybyś nie miał consoleprzedmiotu, który byś zobaczył

ReferenceError: konsola nie jest zdefiniowana

Gdybyś miał consoleobiekt, ale nie logmetodę, którą zobaczysz

TypeError: console.log nie jest funkcją

Jednak to, co masz, jest

TypeError: console.log (...) nie jest funkcją

Zwróć uwagę na (...)nazwę funkcji po nazwie. W tych przypadkach odnosi się do wartości zwracanej przez funkcję.

Podział wiersza nie rozdziela tych dwóch wyrażeń jako oddzielnych instrukcji ze względu na reguły JavaScript dotyczące automatycznego wstawiania średników (ASI) .


Szanuj ;

Wszystkie te fragmenty kodu powodują różnego rodzaju nieoczekiwane błędy, jeśli nie ma średników:

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

Inny przykład

(...)Często widzisz użycie metod łańcuchowych lub powiązanych metod dostępu do właściwości:

string.match(/someRegEx/)[0]

Jeśli to wyrażenie regularne nie zostanie znalezione, metoda zwróci, nulla metoda dostępu do właściwości nullspowoduje, że TypeError: string.match(...) is null - zwracana wartość to null. W przypadku console.log(...)tej wartości zwracanej było undefined.


8
Dzięki. Problem rozwiązany przez dodanie średnika. Co za ciemny róg w javascript.
Qian Chen

4
@ElgsQianChen: To jeden z powodów, dla których warto zawsze używać średników.
Felix Kling

2
tak jest, ponieważ console.log()()jego console.log(...)3 kropki nie są błędem funkcji, w przeciwnym razie powinno być po prostu console.lognie działa (tylko jeśli nie było, ale faktycznie jest)
vinayakj

2
@vinayakj Dokładnie. Jeśli coś nie jest funkcją, to do tej funkcji zawsze odwołuje się nazwa funkcji, np. object.methodJeśli używasz wartości zwracanej, zwłaszcza w przypadku metody łańcuchowej, będzie object.method(...). To trochę wymaga doświadczenia, aby dowiedzieć się, dlaczego zawsze należy używać średników i jak poprawnie interpretować komunikaty o błędach JavaScript.
user4642212

2
Z powodu takich problemów czasami zaleca się zawsze poprzedzać IIFE średnikiem. W ten sposób, jeśli przesuniesz go wokół niego, nie ryzykujesz złamania brakującego średnika w innym miejscu. Dodatkowo, jeśli coś stanie się dziwne podczas minifikacji / tworzenia pakietów, byłoby to bezpieczniejsze.
Marie

5

Błąd oznacza, że wartość zwracana z console.log()nie jest funkcją. Brakuje średnika:

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

co sprawia, że ​​następujący (...)po IIFE jest interpretowany jako wywołanie funkcji.


Porównaj komunikaty o błędach

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

i

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

5

Aktualizacja 2020

Jedną z możliwych przyczyn może być deklaracja var consolegdzieś w skrypcie.

Posługiwać się:

window.console.log(...);

zamiast. Pracował dla mnie.

Mam nadzieję, że to pomoże


Mam ten sam problem i działa global.console.log, dlaczego tak się dzieje? Jak mogę to naprawić i używać consol.log
Gutyn

1

Istnieje inny sposób napotkania tego błędu. console.lognie jest niezmienna i istnieje możliwość przypadkowego nadpisania wartości.

console.log = 'hi';

W takim przypadku wystarczy ponownie załadować stronę, aby cofnąć szkody.


-1

Wiem, że to nie jest „TA” odpowiedź, ale pomyślałem, że podam poniżej

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

Na stronie, którą nazywałem „ konsolą ”, miałem obszar tekstowy . nagle we wszystkich moich skryptach console.log () pojawił się błąd „Uncaught TypeError: console.log nie jest funkcją w obiekcie”

... i słusznie, ponieważ użyłem zarezerwowanej przestrzeni nazw dla mojego obiektu / var. Zrozumiałem, co zrobiłem po przeczytaniu jego postu i ze względu na potomstwo: podwójnie sprawdź konwencje nazewnictwa.

Twoje zdrowie

„to zawsze ludzki błąd”


-1

Przynajmniej w czasie reagowania konsola wydaje się działać bez importu, więc usunięcie import console = require('console');lub import console from 'console';od początku mojego pliku naprawiło to za mnie. (wydaje się, że VS Code IDE dodaje to czasami automatycznie)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.