TypeError: console.log (…) no es una función

100

Estoy realmente confundido sobre cómo puedo obtener que console.log no sea una función en la línea 1091. Si elimino el cierre a continuación, la línea 1091 no se queja de tal error. Versión de Chrome 43.0.2357.130 (64 bits).

ingrese la descripción de la imagen aquí

Aquí está el 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
fuente
Lo siento, la imagen parece haber cambiado de tamaño para ser demasiado pequeña. Estoy tratando de averiguar cómo hacer que muestre el tamaño original.
Qian Chen
3
No utilice imágenes para mostrar su código y errores, es una mala práctica.
Blubberguy22

Respuestas:

206

Solución

Simplemente ponga un punto y coma ( ;) después de console.log().


Explicación

El error se puede reproducir fácilmente así:

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

Está tratando de pasar function(){}como un argumento al valor de retorno del console.log()cual en sí mismo no es una función sino en realidad undefined(verifique typeof console.log();). Esto se debe a que JavaScript lo interpreta como console.log()(function(){}). console.logsin embargo es una función.

Si no tuvieras el consoleobjeto, verías

ReferenceError: la consola no está definida

Si tuvieras el consoleobjeto pero no el logmétodo, verías

TypeError: console.log no es una función

Lo que tienes, sin embargo, es

TypeError: console.log (...) no es una función

Tenga en cuenta el (...)después del nombre de la función. Con esos se refiere al valor de retorno de la función.

El salto de línea no separa estas dos expresiones como declaraciones separadas debido a las reglas de JavaScript para la inserción automática de punto y coma (ASI) .


Respeta el ;

Todos estos fragmentos de código dan como resultado todo tipo de errores inesperados si no hay ningún punto y coma:

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

Otro ejemplo

A (...)menudo se ven con el uso de métodos encadenados o accesos de propiedad encadenados:

string.match(/someRegEx/)[0]

Si no se encuentra esa expresión regular, el método volverá nully el descriptor de acceso de propiedad en nullprovocará un TypeError: string.match(...) is null - el valor de retorno es null. En el caso de console.log(...)la valor de retorno era undefined.

usuario4642212
fuente
8
Gracias. Problema resuelto agregando un punto y coma. Qué rincón oscuro en el javascript.
Qian Chen
4
@ElgsQianChen: Una razón para usar siempre punto y coma.
Felix Kling
2
también lo es porque console.log()()sus console.log(...)3 puntos no un error de función, de lo contrario, debe sido simplemente console.logno es la función (sólo si se suponía, pero en realidad es)
vinayakj
2
@vinayakj Exactamente. Si algo no es una función, siempre se hace referencia a esa función por su nombre de función, por ejemplo object.method, si está utilizando el valor de retorno, especialmente en un método encadenado, lo será object.method(...). Se necesita experiencia para saber por qué siempre debe usar punto y coma y cómo interpretar correctamente los mensajes de error de JavaScript.
user4642212
2
Debido a problemas como este, a veces se recomienda prefijar los IIFE siempre con un punto y coma. De esa manera, si lo mueve, no correrá el riesgo de romper un punto y coma faltante en otro lugar. Además, si las cosas se ponen raras durante la minificación / agrupación, sería más seguro.
Marie
5

El error significa que el valor de retorno de console.log()no es una función. Falta un punto y coma:

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

lo que hace que el seguimiento (...)del IIFE se interprete como una llamada de función.


Compare los mensajes de error de

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

y

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

Actualización 2020

Una posible causa puede ser la declaración de var consolealgún lugar de su script.

Utilizar:

window.console.log(...);

en lugar. Trabajó para mi.

Espero que ayude

Aprendiz
fuente
Tengo el mismo problema y global.console.log funciona, ¿por qué sucede esto? ¿Cómo lo soluciono y uso consol.log?
Gutyn
1

Hay otra forma de encontrar este error. console.logno es inmutable y es posible sobrescribir accidentalmente el valor.

console.log = 'hi';

En este caso, vuelva a cargar la página para deshacer el daño.

Craig Pemberton
fuente
-1

Sé que esta no es "LA" respuesta, pero pensé que incluiría lo siguiente

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

Tenía un área de texto en la página que estaba llamando " consola ". de repente, todos mis scripts de console.log () dieron el error "Uncaught TypeError: console.log no es una función en Object"

... y con razón, porque utilicé un espacio de nombres reservado para mi objeto / var. Me di cuenta de lo que había hecho después de leer su publicación, y por el bien de la posteridad: verificar las convenciones de nombres.

salud

"es siempre un error humano"

Christian Žagarskas
fuente
-1

En react-native al menos, la consola parece funcionar sin ninguna importación, por lo que, al eliminar import console = require('console');o import console from 'console';desde el principio de mi archivo, lo solucionó. (el VS Code IDE parece agregar eso automáticamente a veces)

Top Master
fuente