所以我今天开始弄乱 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
实例。
关于JavaScript:带有函数数组的TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15629239/