TypeError:console.log(…)不是函数


97

我真的很困惑如何获取console.log而不是第1091行上的函数。如果我删除下面的闭包,则第1091行不会抱怨这样的错误。Chrome版本43.0.2357.130(64位)。

在此处输入图片说明

这是代码:

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

抱歉,图片似乎已调整得太小。我正在尝试弄清楚如何使其显示原始大小。
钱陈

2
请不要使用图片来显示您的代码和错误,这是错误的做法。
Blubberguy15年

Answers:


202

只需;console.log(... 之后加上分号())


说明

该错误很容易重现,如下所示:

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

它试图function(){}作为参数传递给返回值console.log()返回值本身不是一个函数,但实际上是undefined(check typeof console.log();)。这是因为JavaScript将其解释为console.log()(function(){})console.log但是一个功能。

如果没有console对象,您将看到

ReferenceError:控制台未定义

如果您有console对象但没有log方法,您将看到

TypeError:console.log不是函数

但是,您拥有的是

TypeError:console.log(...)不是一个函数

注意(...)函数名称之后。那些是指函数的返回值。

由于JavaScript的自动分号插入(ASI)规则,换行符不会将这两个表达式分隔为单独的语句。


尊重 ;

如果没有分号,则所有这些代码段都会导致各种意外错误:

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

另一个例子

您会看到(...)经常使用链式方法或链式属性访问器:

string.match(/someRegEx/)[0]

如果没有发现,正则表达式,该方法将返回null和属性访问null将导致一个TypeError: string.match(...) is null -的返回值null。在该情况下console.log(...)返回值undefined


8
谢谢。通过添加分号解决了问题。JavaScript中的黑角。
钱陈

4
@ElgsQianChen:始终使用分号的原因之一。
Felix Kling 2015年

2
就是因为console.log()()它的console.log(...)3个点不是函数错误,否则应该console.log是不是函数(仅当它没有出现但实际上是它
时才起作用

2
@vinayakj确实如此。如果某项不是函数,那么该函数将始终通过其函数名来引用,例如object.method,如果您使用的是返回值,尤其是在链接方法中,它将为object.method(...)。有点经验是要知道为什么您应该始终使用分号,以及如何正确解释JavaScript错误消息。
user4642212 2015年

2
由于此类问题,有时建议始终在IIFE前面加上分号。这样一来,如果您将它移到其他位置,就不会冒着丢失丢失的分号的风险。此外,如果在缩小/捆绑过程中出现异常现象,这将更加安全。
Marie

5

该错误意味着返回值console.log()是不是一个函数。您缺少分号:

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

这使得(...)IIFE 的以下内容可以解释为函数调用。


比较以下错误消息

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

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

5

2020更新

一种可能的原因可能是var console脚本中某处的声明。

用:

window.console.log(...);

代替。为我工作。

希望对您有所帮助


我有同样的问题,并且global.console.log有效,为什么会这样?我该如何修复并使用consol.log
Gutyn

1

还有另一种遇到此错误的方法。console.log不是不变的,并且可能会意外覆盖该值。

console.log = 'hi';

在这种情况下,只需重新加载页面即可消除损坏。


-1

我知道这不是“ THE”答案,但我想我会在下面抛

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

我在被称为“ 控制台 ” 的页面上有一个文本区域。突然,我所有的console.log()脚本都给出了错误“未捕获的TypeError:console.log不是Object的函数”

...是正确的,因为我为我的对象/变量使用了保留的名称空间。阅读后,我意识到我做了什么,并且为了后代:仔细检查命名约定。

干杯

“它总是人为错误”


-1

至少在react-native中,控制台似乎不需要任何导入即可工作,因此,从文件的开头删除import console = require('console');import console from 'console';从文件开始为我修复了它。(VS Code IDE有时会自动添加它)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.