(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差不多。第一种写法是最推荐的,写一个匿名函数,再在里面写代码。
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差不多。第一种写法是最推荐的,写一个匿名函数,再在里面写代码。