类型错误:console.log(...) 不是函数

IT技术 javascript
2021-02-02 10:39:38

我真的很困惑如何让 console.log is not a function on line 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);
            }
        }
    }
};
6个回答

解决方案

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


解释

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

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

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

如果你没有console你会看到对象

参考错误:控制台未定义

如果你有console对象但没有log你会看到方法

类型错误:console.log 不是函数

然而,你所拥有的是

类型错误: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

也是因为console.log()()它的console.log(...)3 个点不是函数错误,否则它应该只是console.log不是函数(仅当它不是但实际上是)
2021-03-14 10:39:38
@ElgsQianChen:总是使用分号的原因之一。
2021-03-20 10:39:38
谢谢。通过添加分号解决了问题。在 javascript 中多么黑暗的角落。
2021-03-29 10:39:38
由于此类问题,有时建议始终使用分号作为 IIFE 前缀。这样,如果您移动它,它就不会冒着在其他地方破坏丢失的分号的风险。此外,如果在缩小/捆绑期间事情变得奇怪,它会更安全。
2021-04-04 10:39:38
@vinayakj 没错。如果某些东西不是函数,那么该函数总是由它的函数名称引用,例如object.method,如果您使用返回值,尤其是在链式方法中,它将是object.method(...). 了解为什么应该始终使用分号以及如何正确解释 JavaScript 错误消息需要一定的经验
2021-04-05 10:39:38

2020 更新

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

利用:

window.console.log(...);

反而。为我工作。

我希望它有帮助

我有同样的问题并且 global.console.log 有效,为什么会发生这种情况?我如何修复它并使用 consol.log
2021-04-04 10:39:38

该错误意味着返回值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 = 'hi';

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

我知道这不是“THE”答案,但我想我会在以下内容中折腾

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

我在称为“控制台的页面上有一个文本区域突然我所有的 console.log() 脚本都给出了错误“Uncaught TypeError: console.log is not a function at Object”

...这是正确的,因为我为我的对象/变量使用了一个保留的命名空间。读完他的帖子后,我意识到我做了什么,为了后代:仔细检查命名约定。

干杯

“它总是人为错误”