TypeError: console.log (…) não é uma função

97

Estou realmente confuso sobre como posso obter console.log não é uma função na linha 1091. Se eu remover o fechamento abaixo, a linha 1091 não reclamará desse erro. Versão do Chrome 43.0.2357.130 (64 bits).

insira a descrição da imagem aqui

Aqui está o código:

$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);
            }
        }
    }
};
Qian Chen
fonte
Desculpe, a imagem parece ter sido redimensionada para ficar muito pequena. Estou tentando descobrir como fazê-lo mostrar o tamanho original.
Qian Chen
2
Por favor, não use imagens para mostrar seu código e erros, é uma prática ruim.
Blubberguy22

Respostas:

202

Solução

Basta colocar um ponto e vírgula ( ;) após console.log().


Explicação

O erro é facilmente reproduzível desta forma:

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

Ele está tentando passar function(){}como um argumento para o valor de retorno do console.log()qual ele mesmo não é uma função, mas na verdade undefined(verifique typeof console.log();). Isso ocorre porque JavaScript interpreta isso como console.log()(function(){}). console.logno entanto, é uma função.

Se você não tivesse o consoleobjeto, você veria

ReferenceError: console não está definido

Se você tivesse o consoleobjeto, mas não o logmétodo, veria

TypeError: console.log não é uma função

O que você tem, no entanto, é

TypeError: console.log (...) não é uma função

Observe o (...)depois do nome da função. Com aqueles, está se referindo ao valor de retorno da função.

A quebra de linha não separa essas duas expressões como instruções separadas por causa das regras do JavaScript para inserção automática de ponto e vírgula (ASI) .


Respeite o ;

Todos esses snippets de código resultam em todos os tipos de erros inesperados se nenhum ponto-e-vírgula estiver presente:

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

Outro exemplo

(...)Muitas vezes você vê com o uso de métodos encadeados ou acessadores de propriedade encadeados:

string.match(/someRegEx/)[0]

Se esse RegEx não for encontrado, o método retornará nulle o acessador de propriedade em nullcausará um TypeError: string.match(...) is null - o valor de retorno é null. No caso console.log(...)do valor de retorno foi undefined.

user4642212
fonte
8
Obrigado. Problema resolvido adicionando um ponto e vírgula. Que canto escuro no javascript.
Qian Chen
4
@ElgsQianChen: Um motivo para sempre usar ponto-e-vírgula.
Felix Kling
2
assim é porque console.log()()seus console.log(...)3 pontos não são um erro de função, caso contrário, deveria ser simplesmente console.lognão é função (apenas se não fosse, mas na verdade é)
vinayakj
2
@vinayakj Exatamente. Se algo não é uma função, então essa função é sempre referida pelo nome da função, por exemplo object.method, se você estiver usando o valor de retorno, especialmente em um método encadeado, será object.method(...). É preciso muita experiência para saber por que você deve sempre usar ponto- e- vírgula e como interpretar mensagens de erro de JavaScript corretamente.
user4642212
2
Por causa de problemas como esse, às vezes é recomendado sempre prefixar os IIFEs com um ponto-e-vírgula. Dessa forma, se você movê-lo, não haverá o risco de quebrar um ponto-e-vírgula ausente em outro lugar. Além disso, se as coisas ficarem estranhas durante a minimização / agrupamento, seria mais seguro.
Marie
5

O erro significa que o valor de retorno de console.log()não é uma função. Está faltando um ponto e vírgula:

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

o que faz com que o seguinte (...)do IIFE seja interpretado como uma chamada de função.


Compare as mensagens de erro de

> 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
Felix Kling
fonte
5

Atualização de 2020

Uma causa possível pode ser a declaração de var consolealgum lugar em seu script.

Usar:

window.console.log(...);

em vez de. Funcionou para mim.

Espero que ajude

Aprendiz
fonte
Estou com o mesmo problema e global.console.log funciona, por que isso está acontecendo? Como faço para corrigir e usar o consol.log
Gutyn
1

Existe outra maneira de encontrar esse erro. console.lognão é imutável e é possível substituir o valor acidentalmente.

console.log = 'hi';

Nesse caso, basta recarregar a página para desfazer o dano.

Craig Pemberton
fonte
-1

Eu sei que esta não é a resposta "A", mas pensei em lançar a seguinte

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

Eu tinha uma área de texto na página que estava chamando de " console ". de repente, todos os meus scripts console.log () exibiram o erro "Uncaught TypeError: console.log não é uma função no objeto"

... e com razão, porque usei um namespace reservado para meu objeto / var. Percebi o que fiz depois de ler sua postagem, e para o bem da posteridade: verifique novamente as convenções de nomenclatura.

Felicidades

"é sempre erro humano"

Žagarskas cristãos
fonte
-1

Pelo menos no react-native, o console parece funcionar sem nenhuma importação, então, removendo import console = require('console');ou import console from 'console';desde o início do meu arquivo consertou para mim. (o VS Code IDE parece adicionar isso automaticamente às vezes)

Mestre superior
fonte