Javascript:跨浏览器异步调度和竞争条件

时间:2015-09-21 04:15:27

标签: javascript asynchronous cross-browser

我测试了这个codepen example

  • IE 11
  • Chrome 45.0.2454.93 m
  • Firefox 40.0.3

我翻了三个超时时段中第一个的持续时间,如下面的代码片段所示,介于0,1和2之间,并注明了3个浏览器中的结果。

我发现了一个区别,并且发现我无法向自己解释为什么存在这种差异。

为什么chromes输出不同?

IE:

 0. 1 2 3 
 1. 1 1 2
 2. 1 1 2

火狐:

 0. 1 2 3 
 1. 1 1 2
 2. 1 1 2

铬:

 0. 1 2 3 
 1. 1 2 3
 2. 1 1 2

任何人都能解释一下吗?

以下是代码笔中的JS代码段

var obj = {
  value: 1
}

function displayValueInInputOne(obj) {
  document.getElementById('input_1').value = obj.value;
  setTimeout(function(){
      obj.value++;
  }, 0);  // <= switch this zero for a one and then a two...
}

function displayValueInInputTwo(obj) {
  setTimeout(function(){
     document.getElementById('input_2').value = obj.value;
     obj.value++;
  }, 0); 

}

function displayValueInInputThree(obj) {
  setTimeout(function(){
     document.getElementById('input_3').value = obj.value;
  }, 0);

}


(function(theObj){
  displayValueInInputOne(theObj);
  displayValueInInputTwo(theObj);
  displayValueInInputThree(theObj);
})(obj)

1 个答案:

答案 0 :(得分:1)

setTimeout不准确。话虽这么说,无论你设置什么,规格最小值是4ms。嵌入式超时可达10ms。您正在经历的重新排序可能是:

1)随便。

2)实施超时规范的差异结果。

.. a)Firefox做了大量预先计算的代码,IE做了类似的事情

.. b)Chrome更有可能遵循规范,他们的结果是我所期望的。