JavaScript:具有函数数组的TypeError
作者:互联网
因此,我今天开始弄乱JavaScript,并且遇到了一个有趣的案例,在该案例中,似乎确信某物是一个函数,同时也确信它不是一个函数.此代码说明了该问题:
var arr1 = Array(1)
for (i = 0; i < arr1.length; i++) {
arr1[i] = function(n) { return n + i }
}
var arr2 = Array(1)
for (j = 0; j < arr2.length; j++) {
arr2[j] = function(n) { return arr1[j](n) }
}
typeof arr2[0] // "function"
arr2[0](2) // TypeError: Property '1' of object [object Array] is not a function
在这里,您可以将变量分配给arr2 [0],错误仍然存在.我不确定是否需要闭包或数组来复制它.
我的代码有什么问题,还是这只是JavaScript的怪癖之一?这不是我特别需要解决的问题,但这有点傻,所以我想知道是否有原因.
解决方法:
实际上,这确实与闭包有关.
首先,使用以下代码:
for (j = 0; j < arr2.length; j++) {
arr2[j] = function(n) { return arr1[j](n) }
}
变量j最初保持值为0,因此arr2 [0]被设置为对函数的引用.
接下来,j递增,现在值为1.这将终止循环.
现在,当函数被调用时:
return arr1[j](n)
由于闭包,j的最终值仍为1.这是该数组中的无效索引.
还有一点要指出. for循环不会创建新的闭包,因此,如果您期望匿名函数将j的值封装在该迭代中,则该假设是错误的.在声明j的整个函数中,将只有j的一个实例.
标签:closures,typeerror,arrays,javascript,function 来源: https://codeday.me/bug/20191031/1973064.html