为什么在Firefox上完成"click"事件循环之前超时会触发?

vit*_*alh 2 javascript firefox confirm

脚步:

  1. 在Firefox中运行代码
  2. 等5秒钟(重要!)
  3. 按确定或取消
  4. 期望flag == 0,但它是10.

var flag;

function myFunction(){
    flag = 0 
    console.info("initial", flag);
    setTimeout(function(){
        flag = 10;
    }, 200);
  
    confirm("conf");
   
    alert("should be 0: "+flag);
}

document.getElementById('button').onclick=myFunction;
   
                          
Run Code Online (Sandbox Code Playgroud)
<button type="button" id="button">Click Me!</button>
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

因为不像许多浏览器,火狐可以允许的JavaScript线程同时运行其他代码alert,promptconfirm情态动词都显示,暂停当前的代码.(有关该句中"may"的更多信息,请参阅答案的结尾.)alert调用等等的任务被暂停,因此该任务中的代码不会继续,但允许其他任务运行.

这意味着

  • 计时器可以获得回调

  • Ajax完成处理程序可以运行

  • 等等.

从来没有JavaScript 在两个地方并发运行,但Firefox确实让线程运行其他任务,而任务被这些模态暂停.

这是一个Firefox的怪癖.我首先在Stack Overflow上了解它,感谢bobince.


为什么我说"可能"允许JavaScript线程运行:它曾经相当可靠(Firefox的旧版本).我没有任何麻烦,Firefox的42似乎令人不太可能复制它在Firefox 29或38,但它确实还是发生了.

我希望(虽然我可能错了)Mozilla会改变它以与其他浏览器保持一致,因为人们可能认为它违反了JavaScript的任务的运行完成语义,并且这些语义刚刚得到了加强和澄清.最新规格.