gpt4 book ai didi

javascript - JS 闭包和函数参数

转载 作者:行者123 更新时间:2023-12-05 07:52:33 25 4
gpt4 key购买 nike

以下代码片段来自 this 的“示例 5” JS 上的线程和关闭。或者,this other thread有点了解我的好奇心。

function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + i;
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}

function testList() {
var fnlist = buildList([1,2,3]);
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}

这个片段来自的线程说输出是:“item3 undefined”x3。我明白为什么 "item3"被打印了三次,但我不明白为什么 list[i] 是未定义的。

我的问题:既然 list 是 buildList 的参数,那是否意味着它不是 result.push 中匿名函数闭包的一部分?如果在 buildList (otherList) 中有一个变量被设置为列表(匿名函数使用 otherList[i]),那么 otherList[i] 会在闭包中吗? (因此,输出将是“item3 3”x3,而不是“item3 undefined”x3)。

最佳答案

它有三个元素,所以最大有效索引是 2。所以它不打印 item3 undefined它是 item2 undefined .

原因:

因为您知道函数正在打印 item-2 string 每次都是因为,函数绑定(bind)到引用,而不是值。 (这可以使用立即调用函数来避免)。

但是当我越过 i < array.length 时循环停止/暂停,所以 i 的最后更新值现在是 3索引 3 处的数组 [1, 2, 3] 是 undefined .因此,您会看到未定义的值。


验证:

如下所示添加console.log

    for (var i = 0; i < list.length; i++) {
var item = 'item' + i;
result.push( function() {
console.log(i); //Prints 3 for all 3 invocation.
alert(item + ' ' + list[i])
} );
}

关于javascript - JS 闭包和函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33586630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com