Javascript循环中的闭包出现问题



过程:在我制作的游戏中,有一个for循环,应该在数组中保存一个值。该值随每次迭代而变化。问题是:当循环运行完毕时,数组中的每个元素都是相同的,都显示了最新的值
我知道这个问题很常见,在过去的两天里,我做了很多不同的调整和尝试来解决它。

0)我试着尽可能地将事物分离成不同的函数
1)我尝试用"let"定义循环计数器,以便它们具有本地作用域
2)我试着用一个自执行函数包装我的赋值,这样它就会立即发生,在下一次循环迭代改变currentlyOn的值之前保留它。我的计数器是变量c.

(function(c2, currentlyOn2) {
onAtSameTime[c2] = currentlyOn2;
return 0;
})(c, currentlyOn);

3) 我尝试了第二次尝试,添加了返回函数的功能,但仍然没有保存currentlyOn的值。无论如何,这个选项对我来说不是一个好选项,因为关键是我提前做了一些计算,所以我的游戏会有一个快速的动画循环。

onAtSameTime[c] = (function(currentlyOn2) {
return function() {
return currentlyOn2;
};
})(currentlyOn);

我厌倦了把头靠在墙上。有人能解释我做错了什么吗?

有关更多详细信息,请查看我制作的jsfiddle。问题区域在第59行,使用一个简单的赋值:

onAtSameTime[c] = currentlyOn;

onAtSameTime[c] = currentlyOn;onAtSameTime[c]设置为等于currentlyOn引用,因为currentlyOn是一个数组,而不是基元值。该引用会随着每次迭代而更新。您可以通过在将数组添加到onAtSameTime数组之前创建数组的副本来解决此问题。像onAtSameTime[c] = [].concat(currentlyOn);这样的东西就可以了。

看看你的JSFiddle的这个分叉:https://jsfiddle.net/L2by787y/

您可以从currentlyOn复制一个副本,以便分配给onAtSameTime[c]。这会保留值,但不会保留对同一数组的引用。

onAtSameTime[c] = currentlyOn.slice(); // use copy

"use strict";
function log(text) {
document.getElementById("logbox").innerHTML += JSON.stringify(text) + "<br>";
return 0;
}
function whichSwitchesAreOn() {
var currentlyOn = [],
flickedSet,
flickedOne,
turningOnCheck;
for (var c = 0; c < switchesToggled.length; c++) {
flickedSet = switchesToggled[c];
for (var d = 0; d < flickedSet.length; d++) {
flickedOne = flickedSet[d];
turningOnCheck = currentlyOn.indexOf(flickedOne);
if (turningOnCheck == -1) {
currentlyOn.push(flickedOne);
} else {
currentlyOn.splice(turningOnCheck, 1);
}
}
log("currentlyOn: " + currentlyOn);
onAtSameTime[c] = currentlyOn.slice(); // use copy
}
return 0;
}
var switchesToggled = [[0], [1, 2], [0], [2], []],
onAtSameTime = [];
whichSwitchesAreOn();
log(onAtSameTime);
<div id="logbox"></div>

你说你试过let吗?

你有没有让currentlyOn=[]进入for循环?

for(var c = 0; c < switchesToggled.length; c++) {
let currentlyOn = [];

最新更新