编程语言
首页 > 编程语言> > JavaScript:具有函数数组的TypeError

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