TypeError: console.log (…) non è una funzione


100

Sono davvero confuso come posso ottenere console.log non è una funzione sulla riga 1091. Se rimuovo la chiusura di seguito, la riga 1091 non si lamenta di tale errore. Chrome versione 43.0.2357.130 (64 bit).

inserisci qui la descrizione dell'immagine

Ecco il codice:

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

Spiacenti, l'immagine sembra essere stata ridimensionata per essere troppo piccola. Sto cercando di capire come mostrare la dimensione originale.
Qian Chen

3
Si prega di non utilizzare immagini per mostrare il codice e gli errori, è una cattiva pratica.
Blubberguy22

Risposte:


205

Soluzione

Metti semplicemente un punto e virgola ( ;) dopo console.log().


Spiegazione

L'errore è facilmente riproducibile in questo modo:

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

Sta cercando di passare function(){}come argomento al valore restituito di console.log()cui non è una funzione ma in realtà undefined(controllo typeof console.log();). Questo perché JavaScript lo interpreta come console.log()(function(){}). console.logtuttavia è una funzione.

Se non avessi l' consoleoggetto vedresti

ReferenceError: console non definita

Se avessi l' consoleoggetto ma non il logmetodo che vedresti

TypeError: console.log non è una funzione

Quello che hai, tuttavia, è

TypeError: console.log (...) non è una funzione

Notare il (...)dopo il nome della funzione. Con quelli si riferisce al valore di ritorno della funzione.

L'interruzione di riga non separa queste due espressioni come istruzioni separate a causa delle regole di JavaScript per l'inserimento automatico del punto e virgola (ASI) .


Rispetta il ;

Tutti questi frammenti di codice generano tutti i tipi di errori imprevisti se non sono presenti punti e virgola:

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

Un altro esempio

Puoi vedere le (...)volte con l'uso di metodi concatenati o funzioni di accesso alle proprietà concatenate:

string.match(/someRegEx/)[0]

Se quella RegEx non viene trovata, il metodo verrà restituito nulle la funzione di accesso della proprietà attiva nullcauserà un TypeError: string.match(...) is null - il valore restituito è null. Nel caso del console.log(...)il valore di ritorno è stato undefined.


8
Grazie. Problema risolto aggiungendo un punto e virgola. Che angolo oscuro nel javascript.
Qian Chen

4
@ElgsQianChen: un motivo per usare sempre il punto e virgola.
Felix Kling

2
così è perché i console.log()()suoi console.log(...)3 punti non sono un errore di funzione, altrimenti dovrebbe essere semplicemente console.lognon funziona (solo se non lo era ma in realtà lo è)
vinayakj

2
@vinayakj Esattamente. Se qualcosa non è una funzione, allora si fa sempre riferimento a quella funzione con il suo nome di funzione, ad esempio object.method, se stai usando il valore di ritorno, specialmente in un metodo concatenato, lo sarà object.method(...). Ci vuole un po 'di esperienza per sapere perché dovresti sempre usare il punto e virgola e come interpretare correttamente i messaggi di errore JavaScript.
user4642212

2
A causa di problemi come questo, a volte si consiglia di anteporre sempre agli IIFE un punto e virgola. In questo modo se lo sposti non rischierai di rompere un punto e virgola mancante altrove. Inoltre, se le cose si fanno strane durante la minificazione / raggruppamento, sarebbe più sicuro.
Marie

5

L'errore significa che il valore restituito di console.log()non è una funzione. Manca un punto e virgola:

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

che fa (...)interpretare quanto segue dell'IIFE come una chiamata di funzione.


Confronta i messaggi di errore di

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

e

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

5

Aggiornamento 2020

Una possibile causa può essere la dichiarazione di var consoleda qualche parte nel tuo script.

Uso:

window.console.log(...);

anziché. Ha funzionato per me.

spero possa essere d'aiuto


Ho lo stesso problema e global.console.log funziona, perché sta succedendo? Come risolverlo e utilizzare consol.log
Gutyn

1

C'è un altro modo per riscontrare questo errore. console.lognon è immutabile ed è possibile sovrascrivere accidentalmente il valore.

console.log = 'hi';

In questo caso è sufficiente ricaricare la pagina per riparare il danno.


-1

So che questa non è "LA" risposta, ma ho pensato di aggiungere quanto segue

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

Avevo una textarea nella pagina che stavo chiamando " console ". improvvisamente tutti i miei script console.log () hanno dato l'errore "Uncaught TypeError: console.log non è una funzione in Object"

... e giustamente, perché ho usato uno spazio dei nomi riservato per il mio oggetto / var. Ho capito cosa avevo fatto dopo aver letto il suo post, e per il bene dei posteri: ricontrolla le convenzioni di denominazione.

Saluti

"è sempre un errore umano"


-1

Almeno in react-native, la console sembra funzionare senza alcuna importazione, quindi, rimuovendo import console = require('console');o import console from 'console';dall'inizio del mio file è stato risolto per me. (l'IDE VS Code sembra aggiungerlo automaticamente a volte)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.