一道JavaScript面试题(setTimeout)
来源:互联网 发布:美橙互联域名绑定空间 编辑:程序博客网 时间:2024/06/16 12:59
======================================================
注:本文源代码点此下载
======================================================
一道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:13q.lee.lulu 阅读(4302) 评论(37)编辑 收藏
评论:
2184924
#1楼
2011-06-13 18:28 | evanlee
马上
回复 引用 查看
#2楼
2011-06-13 18:31 | gray zhang
无解吧……?
回复 引用 查看
#3楼
2011-06-13 18:43 | 大罗卜
根据设定的时间执行,但是执行的时候while循环语句已经开始执行了,由此判断出,该程序会导致页面的死循环,页面无响应
回复 引用 查看
#4楼
2011-06-13 18:47 | franky
自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
回复 引用 查看
#5楼
2011-06-13 18:48 | 木鱼
@evanlee
典型的死循环……js是单线程执行的,while里面死掉的时候settimeout里面的函数是没机会执行的。
回复 引用 查看
#6楼
2011-06-13 19:06 | 马甲门
settimeout 只是挂了个定时任务,但是 js 本身是单线程的,while 那里肯定死掉了。
回复 引用 查看
#7楼
2011-06-13 20:16 | shuxiang
事实证明,浏览器会谈框停止脚本或浏览器崩掉,6楼正解。话说你现在很牛b了啊!
回复 引用 查看
#8楼
2011-06-13 20:20 | 坎普利特
学习了 = =
回复 引用 查看
#9楼[楼主]
2011-06-13 20:35 | q.lee.lulu
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
回复 引用 查看
#10楼[楼主]
2011-06-13 20:37 | q.lee.lulu
引用木鱼:
@evanlee
典型的死循环……js是单线程执行的,while里面死掉的时候settimeout里面的函数是没机会执行的。
^_^!
死掉这个词用的不怎么恰当,呵呵
回复 引用 查看
#11楼[楼主]
2011-06-13 20:37 | q.lee.lulu
@shuxiang
香香你居然跑来博客园混了 ?
回复 引用 查看
#12楼
2011-06-13 21:05 | 563812344[未注册用户]
死循环了,如果没有死循环也不会马上弹出来。。。要1s后,准不准就不一定了,js是单线程,而且类似定时器这样的玩意儿都不准。以前用c++写程序,本机测试少于50毫秒就不准了。
回复 引用
#13楼
2011-06-13 21:05 | franky
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
回复 引用 查看
#14楼
2011-06-13 21:07 | 行云_流水
@franky
如果想要使用多线程。怎么办呢?
回复 引用 查看
#15楼
2011-06-13 21:17 | mk2
lulu这是想害大家卡死浏览器吧。。。哈哈
回复 引用 查看
#16楼[楼主]
2011-06-13 21:21 | q.lee.lulu
引用franky:
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
先计时开始,然后再去while true的哦
回复 引用 查看
#17楼
2011-06-13 21:30 | franky
很不幸引用q.lee.lulu:
引用franky:
引用q.lee.lulu:
引用franky:自然无解. timeout 回调 是要等退出全部 execution context stack 后,才去计时的.
确定是退出全部 execution context stack 后,才去计时的?
有问什么问题?
先计时开始,然后再去while true的哦
很不幸,并不是这样..
回复 引用 查看
#18楼[楼主]
2011-06-13 21:40 | q.lee.lulu
@franky
很不幸,计时确实已经开始了
1000毫秒后确实计时也结束了
那,然后呢?
嗯,问题就在这里了~~
回复 引用 查看
#19楼
2011-06-13 21:55 | franky
引用q.lee.lulu:
@franky
很不幸,计时确实已经开始了
1000毫秒后确实计时也结束了
那,然后呢?
嗯,问题就在这里了~~
饿.我表达有问题..计时是timeout api被调用时. 但这个callback 会在execution context stack 全部退出后.
回复 引用 查看
#20楼
2011-06-13 21:58 | 打酱油的。。。[未注册用户]
settimeout(function () { alert("start");}, 10);
alert('end');
先弹出end,再弹出start。
回复 引用
#21楼
2011-06-13 22:03 | franky
事实要考虑的东西,比想象的要多. 譬如 html parser 的预读. 这段代码在非opera下就比较有趣.
回复 引用 查看
#22楼
2011-06-13 22:34 | wangtz
引用马甲门:settimeout 只是挂了个定时任务,但是 js 本身是单线程的,while 那里肯定死掉了。
果然是这样!学习了!
回复 引用 查看
#23楼
2011-06-13 23:07 | jeff wong
老大,你的这篇直接导致了我的再思考重新认识javascript的settimeout和异步
回复 引用 查看
#24楼[楼主]
2011-06-13 23:32 | q.lee.lulu
引用franky:
事实要考虑的东西,比想象的要多. 譬如 html parser 的预读. 这段代码在非opera下就比较有趣.
有意思,opera下何解?
回复 引用 查看
#25楼
2011-06-14 00:30 | franky
可以参考:http://www.cnblogs.com/_franky/archive/2010/12/31/1923376.html
个人的一些理解.后面一部分,有提到这个问题.
回复 引用 查看
#26楼
2011-06-14 09:00 | 刘江北
很典型的东西啊,好玩意~~~
回复 引用 查看
#27楼
2011-06-14 10:26 | testzhangsan
要异步?试试老赵的 jscex
回复 引用 查看
#28楼
2011-06-14 15:02 | 幸运猴子
这个...不能用吧,线程会被阻塞...
回复 引用 查看
#29楼
2011-06-14 16:23 | 云霆
果然是无解,会在while语句这里形成死循环!
回复 引用 查看
#30楼
2011-06-14 16:30 | 知乎者也
页面一直都在加载,不会弹出'end'
回复 引用 查看
#31楼
2011-06-14 16:49 | jifsu
没看评论,我觉得这个在各种浏览器下表现应该不一样.
回复 引用 查看
#32楼
2011-06-14 17:02 | jifsu
时间证明:
狗日的浏览器确实不争气,全部假死
ie6直接崩溃
ie9 提示脚本执行时间过长,是否终止,点击否,ie9崩溃
firefox4 提示,选否 ,崩溃
opera11 不提示,也不崩溃,无限等待中
safri5 提示,选否,继续提示.....无限循环
回复 引用 查看
#33楼
2011-06-14 17:23 | icbj.cn
假死
回复 引用 查看
#34楼
2011-06-15 15:26 | 追杀
@icbj.cn
opera11 不提示,也不崩溃,无限等待中
-------------------------------------
经测试,耐心等待后会提示脚本繁忙之类的...
回复 引用 查看
#35楼
2011-06-15 18:45 | 云和山的彼岸
试了一下,浏览器死了,哈哈
回复 引用 查看
#36楼
2011-06-17 17:46 | shuxiang
@q.lee.lulu
跟煜哥混,是很有前途的,果断来混~~
回复 引用 查看
#37楼
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新闻:
·windows 7官方rss动态主题:《昆虫》
·捡到iphone 4s玩自拍 icloud同步酿悲剧
·铁道部购票网站存泄密危险 cdn服务商技术短板是主因
·利用 mimo magictouch 打造另类的平板电脑
·但愿大嘴巴的消息再次失准
» 更多新闻...
最新知识库文章:
·设计师的品牌意识
·如何成为“10倍效率”开发者
·快速排序(quicksort)的javascript实现
·wcf服务端运行时架构体系详解[续篇]
·wcf服务端运行时架构体系详解[下篇]
» 更多知识库文章...
china-pub 2011秋季教材巡展
china-pub 计算机绝版图书按需印刷服务
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- 一道JavaScript面试题(setTimeout)
- 一道有关setTimeout的面试题
- 一道javascript面试题
- javascript setTimeout面试题分析
- 一道面试题引发的面壁:认识JavaScript的settimeout和异步
- 一道javascript算法面试题
- 由一道面试题引发的setTimeout的用法思考
- JavaScript之对象赋值(浅谈一道面试题)
- 一道关于JavaScript变量的面试题
- 一道Javascript面试题引发的血案
- 关于JavaScript的一道初级面试题
- 一道面试题(转)
- 详解setTimeOut面试题
- JavaScript同步、异步、回调执行顺序之经典闭包(setTimeout面试题分析)
- JavaScript关于变量作用域的一道面试题
- 一道被"坑"到的前端Javascript面试题
- 一道被"坑"到的前端Javascript面试题
- 一道关于JavaScript解析器错误的面试题
- Java Web_JSP动作指令
- Frame框架在Html中的应用详解
- 结合 PHP 使用 HTML 表单
- 从Ajax到JQuery Ajax
- AJAX技术基础__循序渐进学习 Ajax 的途径
- 一道JavaScript面试题(setTimeout)
- html 5简易的影片播放器(高手绕行)
- 显示内存中HTML内容的方法
- HTML5标准的另一种死胡同
- Visual Studio 2008中ASP.NET AJAX的新应用程序服务:Role Application Service
- html5本地存储在手机web app中使用探讨
- 隐藏HTML源代码方法
- java实现插入排序
- Delphi 编写 DLL 返回字符串,.net 调用。