JavaScript中setTimeout的那些事儿(2)

<!DOCTYPE html> <head> <title>setTimeout</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> console.log('a'); setTimeout(function(){ console.log('b'); },0); console.log('c'); console.log('d'); </script> </body> </html>

运行代码结果如下:

JavaScript中setTimeout的那些事儿

 

假设你已经知道Javascript单线程的运行原理了。那么,可能会有这样的疑问:setTimeout的时间为0,都没加到处理队列的末尾,怎么会晚执行呢?不应该立即执行吗? 

我的理解是,就算setTimeout的时间为0,但是它仍然是setTimeout啊,原理是不变的。所以会将其加入到队列末尾,0秒后执行。 

况且,经过查找资料发现,setTimeout有一个最小执行时间,当指定的时间小于该时间时,浏览器会用最小允许的时间作为setTimeout的时间间隔,也就是说即使我们把setTimeout的毫秒数设置为0,被调用的程序也没有马上启动。

这个最小的时间间隔是多少呢? 

这和浏览器及操作系统有关。在John Resig的《Javascript忍者的秘密》一书中提到–Browsers all have a 10ms minimum delay on OSX and a(approximately) 15ms delay on Windows.(在苹果机上的最小时间间隔是10毫秒,在Windows系统上的最小时间间隔大约是15毫秒),另外,MDC中关于setTimeout的介绍中也提到,Firefox中定义的最小时间间隔(DOM_MIN_TIMEOUT_VALUE)是10毫秒,HTML5定义的最小时间间隔是4毫秒。 

说了这么多,setTimeout的延迟时间为0,看来没什么意义嘛,都是放在队列后执行嘛。 

非也,天生我材必有用,就看你怎么用咯。抛砖迎玉下。 

1、可以用setTimeout的延迟时间为0,模拟动画效果哦。 

详情请见下代码:

<!DOCTYPE html> <head> <title>setTimeout</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <div></div> <div>click</div> <script> window.onload = function(){ var con = document.getElementById('container'); var btn = document.getElementById('btn'); //Params: i 为起始高度,num为预期高度 function render(i, num) { i++; con.style.height = i + 'px'; //亮点在此 if(i < num){ setTimeout(function() { render(i, num); },0); } else { con = null; btn = null; } }; btn.onclick = function(){ render(100, 200); }; }; </script> </body> </html>

由于是动画,所以想看其效果,还请各位看官运行下代码哦。 

代码第19行中,利用setTimeout,在每一次render执行完成(给高度递增1)后,由于Javascript是单线程,且setTimeout里的匿名函数会在render执行完成后,再执行render。所以可以实现动画效果。 

2、可以用setTimeout的延迟时间为0,实现捕获事件哦。 

当我们点击子元素时,我们可以利用setTimeout的特性,来模拟捕获事件。 

请见如下代码:

<!DOCTYPE html> <head> <title>setTimeout</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> #parent { width:100px; height:100px; border:1px solid black; } #child { width:50px; height:50px; background:pink; } </style> </head> <body> <div> <div></div> </div> <script> //点击子元素,实现子元素的事件在父元素触发后触发 window.onload = function(){ var parent = document.getElementById('parent'); var child = document.getElementById('child'); parent.onclick = function(){ console.log('parent'); } child.onclick = function(){ //利用setTimeout,冒泡结束后,最后输出child setTimeout(function(){ console.log('child'); },0); } parent = null; child = null; } </script> </body> </html>

执行代码,点击粉红色方块,输出结果: 

JavaScript中setTimeout的那些事儿

三、setTimeout那些事儿之this 

说到this,对于它的理解就是:this是指向函数执行时的当前对象,倘若没有明确的当前对象,它就是指向window的。 

好了,那么我们来看看下面这段代码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzzxgs.html