gpt4 book ai didi

javascript - 在 for 循环中让 vs. var

转载 作者:行者123 更新时间:2023-11-29 20:52:49 27 4
gpt4 key购买 nike

如前所述:JavaScript closure inside loops – simple practical example

这段代码的输出总是3

var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
// My value: 3
// My value: 3
// My value: 3

发生这种情况是因为全局 i 和循环匿名函数内的 i 没有区别。所以当 funcs[i] 被调用时,它的当前值已经是 3

解决这个问题的经典方法是通过闭包。

var funcs = [];

function createfunc(i) {
return function() { console.log("My value: " + i); };
}

for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}

for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}

通过将函数创建包装在 createfunc(i) 函数中,您可以确保“i”的值绑定(bind)到函数外部的不变值。

解决这个问题的一种方法是创建一个 let 变量。

 var funcs = [];
for (let i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}

funcs[0]();
funcs[1]();
funcs[2]();
funcs[3]();

通过这样做,我希望变量 let 可以在循环内访问,因此当时我正在调用函数 i 仍然是 undefined

因为它有效,看起来 JS 能够在 for 循环中分配正确的变量 i 并且在我调用函数时它具有正确的值 i 已分配。

我错过了什么?

最佳答案

这是一个 closure .

该函数是在循环内部定义的,因此它可以访问循环内部存在的所有变量,并且只要该函数存在,它就会关闭它们并继续访问它们。

关于javascript - 在 for 循环中让 vs. var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50923825/

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