164

我真的很困惑,我怎么能得到console.log不是1091行的函数。如果我删除下面的闭包,第1091行就不会抱怨这样的错误。Chrome版本43.0.2357.130(64位)。

在此处输入图像描述

代码如下:

$scope.columnNameChanged=函数(tableColumn){setDirtyColumn(tableColumn);//将更改传播到关键字段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])(函数(i,j){$timeout(函数(){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
  • 对不起,图片的大小似乎调整得太小了。我正在想办法让它显示原始尺寸。
    – 用户1663023
    评论 2015年6月23日20:50
  • 7
    请不要使用图片显示代码和错误,这是一种不好的做法。
    – 腮红22
    评论 2015年6月23日20:51

6个答案6

重置为默认值
355

解决方案

只需输入分号(;)之后控制台日志().


解释

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

控制台.log()(函数(){})

它正试图通过函数(){}作为返回值属于控制台.log()它本身不是函数,但实际上未定义(检查控制台类型.log();). 这是因为JavaScript将其解释为console.log()(函数(){}).控制台.log然而一个函数。

如果你没有慰问你会看到的物体

ReferenceError:未定义控制台

如果你有慰问对象,但不是日志你会看到的方法

TypeError:console.log不是函数

然而,你所拥有的是

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

请注意(...)在函数名之后。对于这些,它是指函数的返回值。

换行符没有分开这两个表达式由于JavaScript的自动分号插入规则(ASI).


尊重;

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

console.log()//如前所述()//TypeError:console.log(…)不是函数
console.log()//正在访问返回值的属性1的属性0…[1] [0]//类型错误:console.log(…)未定义
console.log()//类似未定义-3-3//纳米
设a,b;const array=数组.from({length:2})//现在,让我们使用析构化:[a,b]=数组;//ReferenceError:初始化之前无法访问词法声明“array”
设a,b;const数组=数组.from({length:2}).fill(1),array2=数组.from({长度:2})//现在,让我们使用析构函数。尝试将“array”中的两个1作为“a”和“b”:[a,b]=数组;控制台.log(a,b);//未定义未定义

另一个例子

你看到了(...)通常使用链式方法或链式属性访问器:

string.match(/someRegEx/)[0]

如果找不到该RegEx,该方法将返回无效的和上的属性访问器无效的将导致TypeError:string.match(…)为空 — 这个返回值无效的.在以下情况下console.log(…)这个返回值未定义.

11
  • 19
    谢谢。问题通过添加分号解决。javascript中的一个多么黑暗的角落。
    – 用户1663023
    评论 2015年6月23日20:59
  • 6
    @ElgsQianChen:总是使用分号的原因之一。 评论 2015年6月23日21:00
  • 2
    这是因为console.log()()它的console.log(…)3点不是函数错误,否则应该只是控制台.log不是函数(仅当它不是,但实际上是) 评论 2015年6月23日21:01
  • 2
    @vinayakj没错。如果某个东西不是函数,那么该函数总是由其函数名引用,例如。对象.方法,如果您使用的是返回值,尤其是在链式方法中,那么对象.方法(…)有点需要经验才能知道为什么你应该总是使用分号,如何正确解释JavaScript错误消息。 评论 2015年6月23日21:04
  • 4
    由于此类问题,有时建议始终在IIFE前面加上分号。这样,如果你移动它,就不会有在别处破坏丢失的分号的风险。此外,如果在缩小/捆绑过程中事情变得奇怪,那么会更安全。
    – 玛丽
    评论 2019年6月12日14:19
13

该错误意味着返回值属于控制台.log()不是函数。您缺少分号:

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

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


比较的错误消息

>var foo={bar:未定义};>foo.bar();未捕获类型错误:foo.bar不是函数

>var foo={bar:function(){}};>foo.bar()();未捕获类型错误:foo.bar(…)不是函数
0
6

2020年更新

一个可能的原因是var控制台在你的剧本中。

使用:

window.console.log(…);

而不是。为我工作。

我希望它有帮助

1
  • 我也有同样的问题,global.console.log正常工作,为什么会发生这种情况?如何修复并使用consol.log
    – 古坦
    评论 2019年4月18日23:27
2

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

console.log=“hi”;

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

0

我知道这不是“正确”的答案,但我想我会抛出以下答案

var控制台=$(数据消息目标);console.val(console.瓦尔()+data.message);console.scrollTop(console[0].srollHeight-console.height());

我打电话的页面上有一个文本区域“慰问“.突然,我所有的console.log()脚本都出现了错误“未捕获的类型错误:console.log不是Object处的函数”

……这是正确的,因为我为我的object/var使用了一个保留的名称空间。我在阅读了他的帖子后意识到了我所做的事情,为了后代的利益:仔细检查命名约定。

干杯

“总是人为错误”

-1

至少在react-native中,控制台似乎可以在没有任何导入的情况下工作,因此,删除导入控制台=需要(“控制台”);从“控制台”导入控制台;从文件一开始就为我修复了它。(VS代码IDE似乎有时会自动添加它)