更新:此错误影响 v28 和 was fixed对于 v29 以后。
具有这样的功能:
function arrMany(len) {
var a = new Array(len);
}
如果快速调用函数,生成的数组的长度有时会是上一次函数调用的长度。
将函数扩展为:
function arrMany(len, show) {
var a = new Array(len);
if (show) {
someElementTextA.value = a.length;
someElementTextB.value = len;
}
}
并通过例如调用:
function tick() {
arrMany(2);
arrMany(4);
arrMany(6);
arrMany(10, true);
}
setInerval(tick, 1000 / 200);
一段时间后 someElementTextA
显示值 6
而不是 10
。
当发生这种情况时,将 fps 调低到例如 1,它会在很长一段时间内不断吐出错误的长度。
该行为通常会在我的系统上大约 20 秒后自行显现。
测试于:Firefox Linux i686; rv:28.0
注意事项:
- 浏览器控制台 或 Web 控制台 中没有任何操作。
- 如果 Web Console 打开,则永远不会发生错误。
- 如果在出现错误时打开了 Web 控制台,它会立即自行更正。
- 给出点。 3. 很难使用浏览器本身以理智的方式进行调试。
对此有什么好的解决办法吗?
更新 1:
已在 Firefox、Chrome 和 Opera 上测试过。 Firefox 是唯一出现该错误的浏览器。控制台中没有任何操作。
来自评论和回答:在 Window XP、Firefox v31 上不显示。是否显示在 @jdigital的系统——即它不是我系统的本地系统。
更新 2:
在上面的代码中始终指定 show
没有任何区别。
function tick() {
arrMany(2, false);
arrMany(4, false);
arrMany(6, false);
arrMany(10, true);
}
也不使用默认参数。但还有一点是,show
只是为了方便示例代码。
关于难题说法的解决方案:
if (arr.length !== len) { arr = new Array(len); }
似乎有效。但不确定这是否是一个修复,或者这是否可以以同样的方式中断。使用
if (arr.length !== len) { arr = new Array(len); retry = 1; }
表明重试非常频繁。
另一个修复,(在调试测试中);但以另一种方式。通过在函数中添加这个,数组的长度总是正确的。如:retry
始终为 0
。
for (retry = 0; arr.length !== len && retry < 10; ++retry) {
arr = new Array(len);
}
至于问题。
- 问题更多的是该错误是否有任何好的修复,而不是它是否是错误。
关于为什么发生这种情况的任何信息,以及是否有任何类似的代码,例如不处理数组,可以以相同的方式中断也很有趣,但不是原始问题的一部分。
更新 3:
对于,“我想做什么”,这是一个一般意义上的问题,而不是特定于一个案例。
这不是我通常使用的语法,但时常发生,通常在一些调试或详细输出中使用稀疏数组比循环更简单。但很高兴知道它不可靠。
与此同时,我认识到其他人可能有不同的需求,因此从广义上讲,拥有这样的解决方案总是很好。
再一次;反过来我想这将是反对使用它的另一个论点......;)
最佳答案
这对我有用:
function arrMany(w, show) {
(function () {
var a = new Array(w);
if (show) {
arw1.value = a.length;
arw2.value = w;
}
})();
}
有趣的阅读: JavaScript's Strange Threaded Nature
这段代码探讨了以下属性:
(function() { new Object(); })();
is garbage collected properly
关于javascript - new Array(length) 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726716/