JavaScript:带有函数数组的TypeError

标签 javascript arrays function closures 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 实例。

关于JavaScript:带有函数数组的TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15629239/

相关文章:

javascript - 在应用程序数据中存储和检索 WinJS.Binding.List

javascript - 如何切换列表中的元素单击?

javascript - 如何根据 obj 标志的状态查找数组长度

PHP 析因问题

c++ - 尝试使用头文件

Javascript - 用于检查数组元素上的 isInteger 的 every() 方法

javascript - 收到错误 : Argument of type '() => () => boolean' is not assignable to parameter of type 'EffectCallback'

javascript - 为什么添加 "{" "}"会从数组中删除括号? (JavaScript)

python - 运行 Numpy Meshgrid 时出现 MemoryError

c - 为什么我仍然收到这些错误?