js的setTimeout异步机制

(1)
setTimeout的异步以及js是单线程的面试题
<script type="text/javascript">
var t=true;
window.setTimeout(function(){
t=false;
},1000);
while(t){


}
alert('end');
</script>


这个怎么解释啊,好像是死循环,说是setTimeout的异步以及js是单线程




(2)
回答以上题目:
确实是死循环导致setTimeout不执行,也导致alert不执行。
js是单线程是对的,所以会先执行while(t){}再alert,但这个循环体是死循环,所以永远不会执行alert。
至于说为什么不执行setTimeout,是因为js的工作机制是:
当线程中没有执行任何同步代码的前提下才会执行异步代码,
setTimeout是异步代码,所以setTimeout只能等js空闲才会执行
,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。










(3)
JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序










(4)
我所遇到的问题是:
每6秒发送一次ajax请求 用的是setTimeout跟ajax
这两个都是异步的 所以没到6秒就开始自己发送ajax 乱七八糟












(5)
function fn() { 
setTimeout(function(){alert('can you see me?');},1000); 
while(true) {} 

alert永远不会发生 




这也就证明:js的setTimeout跟setInterval是“伪异步”的








(6)
结论:
(1)serTimeout跟setInterval都是异步的
(2)js的setTimeout跟setInterval是“伪异步”的
(3)js的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码










(7)
他们共同的一个bug:隔n秒就递归调用函数自己


正确:
function a(){
setTimeout(funtion(){a();},100);//或者setTimeout(a,100);
}


a();


这种方法可以隔1秒调用一次自己,但是当我使用时 显示a函数未定义。。。






错误:
setTimeout(“a()”,100);
a();




至今不知道为什么:以后在setTimeout这种延时函数里调用函数最好是写在function(){}里




网上结论:
无论何时不建议在setTimeout里传字符串进去,虽然可以用,但是有很大缺点,和eval差不多。第一种写法是最推荐的,写一个匿名函数,再在里面写代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值