编辑:更简单的repro案例;以下代码:
- 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/
(原始问题如下)
给出以下代码(或code like it (fiddle)):
- <!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退格2时,我在Developer Console中看到以下内容:
一旦我看到4294967295(232-1)的索引显示,事情有时会开始“变坏”:有时开发人员工具会自动关闭,有时所有Safari选项卡都会冻结并需要重新启动才能恢复.
奇怪的是,如果我在循环中移除(在这种情况下很大程度上无用),我无法重复这一点.我无法在Chrome或Firefox上重复此操作.
任何人都可以对这个问题的根源有什么看法?
OS X 10.7.4上的Safari 5.1.7就是这种情况
解决方法
这听起来像是JavaScriptCore中的一个错误.当foo第二次被调用时,foo可能正在被JIT,并且JITted代码引入了bug.
我建议filing a bug对抗JavaScriptCore并附上你的测试用例.