Log (...)不是函数

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

enter image description here

密码如下:

$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);
}
}
}
};
124617 次浏览

这个错误意味着 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

解决方案

只需在 console.log(... )后面放一个分号(;)。


解释

这个错误很容易重现如下:

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

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

如果没有 console对象,就会看到

ReferenceError: 未定义控制台

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

Log 不是函数

然而,你所拥有的

Log (...)不是函数

注意函数名后面的 (...),它指的是函数的返回值。

由于 JavaScript 的 自动分号插入规则,该行分隔 不能把这两个表达分开作为单独的语句。


尊重 ;

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

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

2020年最新情况

一个可能的原因是脚本中某个地方的 var console声明。

用途:

window.console.log(...);

相反,对我很有效。

希望能有所帮助

还有另一种方法可以遇到这个错误。console.log不是不可变的,有可能意外地覆盖该值。

console.log = 'hi';

在这种情况下,只需重新加载页面以撤销损坏。

我知道这不是“那个”的答案,但是我想我会抛出以下几个问题

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

我有一个文本区域在页面上,我正在调用“ 控制台”。突然,我所有的 console.log ()脚本给出了错误 “ Uncatch TypeError: console.log 不是 Object 上的函数”

... 这样做是正确的,因为我为 object/var 使用了一个保留的名称空间。在读了他的帖子之后,我意识到自己做了什么,也是为了子孙后代: 仔细检查命名规则。

干杯

“总是人为的错误”

至少在本机反应,控制台似乎没有任何导入工作,因此,删除 import console = require('console');import console from 'console';从我的文件开始为我修复它。(VS Code IDE 似乎有时会自动添加这一点)