如图所示,尽管在255ms处添加了定时器代码,但这时候还不能执行,因为onclick事件处理程序仍在运行。定时器代码最早能执行的时机是在300ms处,即onclick事件处理程序结束之后。



实际上,把setTimeout的第二个参数设置为0s,并不是立即执行函数的意思,只是把函数放入异步队列。浏览器先执行完同步队列里的任务,才会去执行异步队列中的任务。


验证例子:

例一:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

<script>

(function(){

var i=0;

setTimeout(function(){

document.getElementById("demo").innerHTML=1233131123;

},2500)

setInterval(function(){

i++;

document.getElementById("demo").innerHTML=i;

},1000)

})()

</script>

</head>

<body>

<h1>我的第一个 JavaScript 程序</h1>

<p id="demo">这是一个段落</p>

<button type="button" onclick="displayDate()">显示日期</button>

</body>

</html>

此代码结果显示先后顺序:

1(1s)、2(2s)、1233131123(2.5s)、3(3s)、4(4s)........

原理分析:


例二:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

<script>

(function(){

var i=0;

setInterval(function(){

i++;

document.getElementById("demo").innerHTML=i;

setTimeout(function(){

document.getElementById("demo").innerHTML=1233131123;

},2500)

},1000)

})()

</script>

</head>

<body>

<h1>我的第一个 JavaScript 程序</h1>

<p id="demo">这是一个段落</p>

<button type="button" onclick="displayDate()">显示日期</button>

</body>

</html>

效果及分析: