編集:より単純な再現ケース; 次のコード:
setInterval(function(){
var a=[10,20,30,40], i=-1;
a[-1] = 42;
while (i<10000) a[i++];
console.log(a[-1],a[4294967295]);
},100);
…出力を生成します:
42 undefined
undefined 42
42 undefined
37x undefined 42
42 undefined
undefined 42
42 undefined
41x undefined 42
42 undefined
undefined 42
42 undefined
自分で試してみてください:http://jsfiddle.net/Fjwsg/
(元の質問は次のとおりです)
次のコード(またはそのようなコード(フィドル) )が与えられます:
<!DOCTYPE HTML>
<html><head><title>-1 Array Index</title></head><body>
<label>p: <input id="p" size="3"></label>
<script type="text/javascript">
var p = document.getElementById('p');
p.onkeyup = function(){
var a = "10 20 30 40".split(/\s+/);
foo(a, p.value*1);
}
function foo(a,p){
var count=a.length, i=0, x;
if (p) a[i=-1]=p;
while (i<10000) x = a[i++ % count];
console.dir(a);
}
</script>
</body></html>
「p」入力にフォーカスして入力すると、開発者コンソールに次のように表示されます1 backspace 2。
4294967295
(2 32-1 )のインデックスが表示されると、状況が「悪化」し始めることがあります。開発者ツールが自動的に閉じたり、すべてのSafariタブがフリーズして、回復するために再起動が必要になることがあります。
奇妙なことに、whileループ(この場合はほとんど役に立たない)を削除すると、これを再現できません。そして、ChromeやFirefoxでこれを再現することはできません。
誰かがこの問題の根本にある可能性があるものに光を当てることができますか?
これは、OSX10.7.4のSafari5.1.7で発生しています。