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

时间:2015-06-23 20:48:15

标签: javascript

我真的很困惑,我怎么能得到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);
            }
        }
    }
};

6 个答案:

答案 0 :(得分:139)

解决方案

只需在; ... console.log(后添加分号())。

说明

错误很容易重现:

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

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

如果您没有console对象,则会看到

  

ReferenceError:未定义控制台

如果您有console个对象,但没有log方法,那么

  

TypeError:console.log不是函数

然而,你所拥有的是

  

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

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

尊重;

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

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

另一个例子

您经常使用链式方法或链式属性访问器来查看(...)

string.match(/someRegEx/)[0]

如果找不到该RegEx,该方法将返回nullnull上的属性访问者将导致TypeError: string.match(...) is null - 返回值null。在console.log(...)的情况下,返回值undefined

答案 1 :(得分:4)

错误表示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

答案 2 :(得分:2)

一个可能的原因可能是在脚本中的某处声明了var console

使用:

window.console.log(...);

代替。为我工作。

我希望它有所帮助

答案 3 :(得分:0)

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

console.log = 'hi';

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

答案 4 :(得分:0)

我知道这不是“ THE”答案,但以为我会在下面提出建议

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

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

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

欢呼

“总是人为错误”

答案 5 :(得分:0)

console似乎无需任何导入即可工作,因此,从文件开头删除import console from 'console';对我来说是固定的。