TypeError: console.log (…) n'est pas une fonction


100

Je ne comprends vraiment pas comment je peux obtenir console.log n'est pas une fonction sur la ligne 1091. Si je supprime la fermeture ci-dessous, la ligne 1091 ne se plaint pas d'une telle erreur. Version de Chrome 43.0.2357.130 (64 bits).

entrez la description de l'image ici

Voici le code:

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

Désolé, l'image semble être redimensionnée pour être trop petite. J'essaie de comprendre comment lui faire afficher la taille d'origine.
Qian Chen

3
Veuillez ne pas utiliser d'images pour montrer votre code et vos erreurs, c'est une mauvaise pratique.
Blubberguy22

Réponses:


203

Solution

Mettez simplement un point-virgule ( ;) après console.log().


Explication

L'erreur est facilement reproductible comme ceci:

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

Il essaie de passer function(){}comme argument à la valeur de retourconsole.log() dont elle-même n'est pas une fonction mais en fait undefined(vérifier typeof console.log();). C'est parce que JavaScript interprète cela comme console.log()(function(){}). estconsole.log cependant une fonction.

Si vous n'aviez pas l' consoleobjet que vous verriez

ReferenceError: la console n'est pas définie

Si vous aviez l' consoleobjet mais pas la logméthode que vous verriez

TypeError: console.log n'est pas une fonction

Ce que vous avez, cependant, c'est

TypeError: console.log (...) n'est pas une fonction

Notez (...)après le nom de la fonction. Avec ceux-ci, il fait référence à la valeur de retour de la fonction.

Le saut de ligne ne sépare pas ces deux expressions comme des instructions distinctes en raison des règles de JavaScript pour l'insertion automatique de points-virgules (ASI) .


Respectez le ;

Tous ces extraits de code entraînent toutes sortes d'erreurs inattendues si aucun point-virgule n'est présent:

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 autre exemple

Vous voyez (...)souvent l'utilisation de méthodes chaînées ou d'accesseurs de propriété chaînés:

string.match(/someRegEx/)[0]

Si ce RegEx n'est pas trouvé, la méthode retournera nullet l'accesseur de propriété sur nullprovoquera un TypeError: string.match(...) is null - la valeur de retour est null. Dans le cas de console.log(...)la valeur de retour était undefined.


8
Merci. Problème résolu en ajoutant un point-virgule. Quel coin sombre dans le javascript.
Qian Chen

4
@ElgsQianChen: Une raison de toujours utiliser des points-virgules.
Felix Kling

2
il en est de même parce que console.log()()ses console.log(...)3 points ne sont pas une erreur de fonction, sinon cela ne devrait tout simplement console.logpas être une fonction (seulement si ce n'était pas le cas mais en fait)
vinayakj

2
@vinayakj Exactement. Si quelque chose n'est pas une fonction, alors cette fonction est toujours référencée par son nom de fonction, par exemple object.method, si vous utilisez la valeur de retour, en particulier dans une méthode chaînée, ce sera le cas object.method(...). Il faut un peu de l'expérience pour savoir pourquoi vous devez toujours utiliser des points-virgules et comment interpréter correctement les messages d'erreur JavaScript.
user4642212

2
En raison de problèmes comme celui-ci, il est parfois recommandé de toujours préfixer les IIFE par un point-virgule. De cette façon, si vous le déplacez, vous ne risquez pas de casser un point-virgule manquant ailleurs. De plus, si les choses deviennent bizarres pendant la minification / regroupement, ce serait plus sûr.
Marie

5

L'erreur signifie que la valeur de retour de console.log()n'est pas une fonction. Il vous manque un point-virgule:

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

ce qui permet (...)d'interpréter ce qui suit de l'IIFE comme un appel de fonction.


Comparez les messages d'erreur de

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

et

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

5

Mise à jour 2020

Une cause possible peut être la déclaration de var consolequelque part dans votre script.

Utilisation:

window.console.log(...);

au lieu. A travaillé pour moi.

J'espère que ça aide


J'ai le même problème et global.console.log fonctionne, pourquoi cela se produit-il? Comment puis-je le réparer et utiliser le consol.log
Gutyn

1

Il existe une autre façon de rencontrer cette erreur. console.logn'est pas immuable et il est possible d'écraser accidentellement la valeur.

console.log = 'hi';

Dans ce cas, rechargez simplement la page pour réparer les dégâts.


-1

Je sais que ce n’est pas "LA" réponse, mais je pensais que je lancerais ce qui suit

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

J'avais une zone de texte sur la page que j'appelais " console ". soudainement tous mes scripts console.log () ont donné l'erreur "Uncaught TypeError: console.log n'est pas une fonction sur Object"

... et à juste titre, car j'ai utilisé un espace de noms réservé pour mon objet / var. J'ai réalisé ce que j'avais fait après avoir lu son message, et pour le bien de la postérité: vérifier les conventions de nommage.

à votre santé

"c'est toujours une erreur humaine"


-1

Au moins en react-native, la console semble fonctionner sans aucune importation, donc, la suppression import console = require('console');ou import console from 'console';le début de mon fichier l'a corrigé pour moi. (l'IDE VS Code semble l'ajouter automatiquement parfois)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.