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

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

代码如下:

$scope.columnNameChanged=函数(tableColumn){
setDirtyColumn(tableColumn);
//将更改传播到关键字段
对于(变量i=0;i<$scope.tableIndexes.length;++i){
对于(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);
}
}
}
};

解决方案

只需在控制台.log(后面加一个分号(


解释

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

console.log()
(函数(){})

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

如果没有控制台对象,您会看到

ReferenceError:未定义控制台

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

TypeError:console.log不是一个函数

然而,你所拥有的是

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

注意函数名后面的(…)。对于这些函数,它指的是函数的返回值

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


尊重

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

console.log()//如前所述
()//类型错误:console.log(…)不是函数
console.log()//访问返回值的属性1的属性0…
[1] [0]//类型错误:console.log(…)未定义
console.log()//类似未定义-3
-3//NaN
让a、b;
常量数组=数组。从({length:2})
//现在,让我们使用分解:
[a,b]=数组;//ReferenceError:在初始化之前无法访问词法声明“数组”
让a、b;
常量数组=数组.from({length:2}).fill(1),
array2=Array.from({length:2})
//现在,让我们使用解构。尝试从'array'中获取两个1作为'a'和'b':
[a,b]=数组;
console.log(a,b);//未定义未定义

另一个例子

通过使用链式方法或链式属性访问器,您经常会看到(…)

string.match(/someRegEx/)[0]

如果未找到该正则表达式,该方法将返回null,并且null上的属性访问器将导致TypeError:string.match(…)为null — 返回值null。在console.log(…)的情况下,返回值未定义的

发表评论