我做了很多搜索,但仍然无法弄清楚。

很简单,全局变量的初始值为false

var globalVar = false;
setTimeout两次用于调用相同的函数:
function(){
    if(!globalVar){
        globalVar = true;
        alert('show only once');
    }
}

那么alert仅被调用一次吗?还是可能出现种族状况?

最佳答案

不在您的情况下。 Javascript在单线程环境中运行。您的一个超时将在另一个超时之前完全执行,这意味着当另一个超时执行时,它将看到globalVartrue

唯一可能发生的并发问题是等待IO,超时或类似情况。在这一点上,其他的JavaScript被允许执行。任何代码都不会中断其他代码来执行。

例如:

setTimeout(function () { alert('hi!'); }, 1000);
while(true) {}

您将永远不会看到警报,因为while循环将忙于等待,将javascript线程压缩为其他代码,并且永远不会给超时提供执行机会。

10-06 15:46