一道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^)/
原创粉丝点击