======================================================
注:本文源代码点此下载
======================================================
一道javascript面试题(settimeout)
下面的代码,多久之后会弹出'end'? 为什么?
var t = true;
settimeout(function(){ t = false; }, 1000);
while(t){ }
alert('end');
这是以前在想有没办法实现阻塞javascript线程的时候(即实现sleep方法),想过的一种实现。
很简单,是吧?
是吗?
作者:qleelulu
出处:http://qleelulu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
标签: javascript
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2011-06-13 18:13 q.lee.lulu 阅读(4302) 评论(37)编辑 收藏
评论:
2184924
马上
回复 引用 查看
无解吧……?
回复 引用 查看
根据设定的时间执行,但是执行的时候while循环语句已经开始执行了,由此判断出,该程序会导致页面的死循环,页面无响应
回复 引用 查看
自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
回复 引用 查看
@evanlee
典型的死循环……js是单线程执行的,while里面死掉的时候settimeout里面的函数是没机会执行的。
回复 引用 查看
settimeout 只是挂了个定时任务,但是 js 本身是单线程的,while 那里肯定死掉了。
回复 引用 查看
事实证明,浏览器会谈框停止脚本或浏览器崩掉,6楼正解。话说你现在很牛b了啊!
回复 引用 查看
学习了 = =
回复 引用 查看
#9楼[楼主]
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
回复 引用 查看
#10楼[楼主]
引用木鱼:
@evanlee
典型的死循环……js是单线程执行的,while里面死掉的时候settimeout里面的函数是没机会执行的。
^_^!
死掉这个词用的不怎么恰当,呵呵
回复 引用 查看
#11楼[楼主]
@shuxiang
香香你居然跑来博客园混了 ?
回复 引用 查看
2011-06-13 21:05 | 563812344[未注册用户]
死循环了,如果没有死循环也不会马上弹出来。。。要1s后,准不准就不一定了,js是单线程,而且类似定时器这样的玩意儿都不准。以前用c++写程序,本机测试少于50毫秒就不准了。
回复 引用
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
回复 引用 查看
@franky
如果想要使用多线程。怎么办呢?
回复 引用 查看
lulu这是想害大家卡死浏览器吧。。。哈哈
回复 引用 查看
#16楼[楼主]
引用franky:
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
先计时开始,然后再去while true的哦
回复 引用 查看
很不幸引用q.lee.lulu:
引用franky:
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
先计时开始,然后再去while true的哦
很不幸,并不是这样..
回复 引用 查看
#18楼[楼主]
@franky
很不幸,计时确实已经开始了
1000毫秒后确实计时也结束了
那,然后呢?
嗯,问题就在这里了~~
回复 引用 查看
引用q.lee.lulu:
@franky
很不幸,计时确实已经开始了
1000毫秒后确实计时也结束了
那,然后呢?
嗯,问题就在这里了~~
饿.我表达有问题..计时是timeout api被调用时. 但这个callback 会在execution context stack 全部退出后.
回复 引用 查看
2011-06-13 21:58 | 打酱油的。。。[未注册用户]
settimeout(function () { alert("start");}, 10);
alert('end');
先弹出end,再弹出start。
回复 引用
事实要考虑的东西,比想象的要多. 譬如 html parser 的预读. 这段代码在非opera下就比较有趣.
回复 引用 查看
引用马甲门:settimeout 只是挂了个定时任务,但是 js 本身是单线程的,while 那里肯定死掉了。
果然是这样!学习了!
回复 引用 查看
老大,你的这篇直接导致了我的再思考 重新认识javascript的settimeout和异步
回复 引用 查看
#24楼[楼主]
引用franky:
事实要考虑的东西,比想象的要多. 譬如 html parser 的预读. 这段代码在非opera下就比较有趣.
有意思,opera下何解?
回复 引用 查看
可以参考:http://www.cnblogs.com/_franky/archive/2010/12/31/1923376.html
个人的一些理解.后面一部分,有提到这个问题.
回复 引用 查看
很典型的东西啊,好玩意~~~
回复 引用 查看
2011-06-14 10:26 | testzhangsan
要异步?试试老赵的 jscex
回复 引用 查看
这个...不能用吧,线程会被阻塞...
回复 引用 查看
果然是无解,会在while语句这里形成死循环!
回复 引用 查看
页面一直都在加载,不会弹出'end'
回复 引用 查看
没看评论,我觉得这个在各种浏览器下表现应该不一样.
回复 引用 查看
时间证明:
狗日的浏览器确实不争气,全部假死
ie6直接崩溃
ie9 提示脚本执行时间过长,是否终止,点击否,ie9崩溃
firefox4 提示,选否 ,崩溃
opera11 不提示,也不崩溃,无限等待中
safri5 提示,选否,继续提示.....无限循环
回复 引用 查看
假死
回复 引用 查看
@icbj.cn
opera11 不提示,也不崩溃,无限等待中
-------------------------------------
经测试,耐心等待后会提示脚本繁忙之类的...
回复 引用 查看
试了一下,浏览器死了,哈哈
回复 引用 查看
@q.lee.lulu
跟煜哥混,是很有前途的,果断来混~~
回复 引用 查看
2011-08-25 00:27 | yingzai621[未注册用户]
@q.lee.lulu
代码改成这样是不是就成功弹出‘end’了?
function a(){}
var t = true;
settimeout(function(){ t = false; }, 1000);
while(t){a(); }
alert('end');
回复 引用
发表评论
昵称: [登录]
主页:
邮箱:(仅博主可见)
验证码:看不清。
换一个
评论内容:
记住我的昵称和主页
-->
[使用ctrl+enter键快速提交评论]
0
2079965
jicuf9skoki=
最新it新闻:
» 更多新闻...
最新知识库文章:
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/