更新: 此错误会影响v28和was fixed for v29 for。
有这样的功能:
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
注意:
对此有什么好的解决方法吗?
已在Firefox,Chrome和Opera上测试过此功能。 Firefox是唯一能够显示错误的浏览器。在控制台中没有任何操作。
来自评论和回答:不在Window XP,Firefox v31上显示。在@jdigital的系统上显示 - 即它不是我的系统的本地。
始终在上面的代码中指定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);
}
为什么发生这种情况的任何信息,如果有任何类似的代码,例如不处理数组,可以以相同的方式打破也很有趣,但不是原始问题的一部分。
对于,“我要做的事情”,这是一般意义上的问题,并非针对案例。
这不是我通常使用的语法,但有时会发生,通常在某些调试或详细输出中,使用稀疏数组 simpler 然后是循环。但很高兴知道不可靠。
与此同时,我认识到其他人可能有不同的需求,因此在广义的一般意义上,解决方案总是很好。
然后再说;反过来说,我想这将是反对使用它的另一个论点......;)
答案 0 :(得分:2)
这对我有用:
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(); })();
正确收集垃圾
答案 1 :(得分:1)
它看起来像Firefox中的一个错误。 Chrome等中不会出现此问题 当我添加日志声明时:
function arrMany(w, show) {
var a = new Array(w);
if (show) {
if( a.length != w ) {
console.log(a);
}
arw1.value = a.length;
arw2.value = w;
}
}
运行时,我可以看到偶尔会触发console.log
,Firefox Web控制台窗口显示该数组有5个元素。
答案 2 :(得分:1)
如果我理解正确,你想要一个解决这个bug的方法,即使它是一个丑陋的黑客,只要它是可靠的。如果是这样,请考虑这种显式初始化数组的方法:
function arrMany(w, show) {
// should be:
// var a = new Array(w);
// but there's a bug in Firefox, see StackOverflow 22726716
//
var a = [];
for( var i = 0; i < w; i++ ) a[i] = undefined;
if (show) {
arw1.value = a.length;
arw2.value = w;
}
}