关于阿里的笔试题for循环中嵌套setTimeout
2016-04-18 10:23
253 查看
题目:
要求输出a的所有项。
该题目考察的就是JavaScript的单线程以及setTimeout的异步特性。
【注】:JavaScript引擎是单线程运行的,浏览器运行期间只有一个线程在运行js程序。浏览器的内核是多线程的,他们在内核控制下相互配合,以保持同步,一个浏览器至少实现三个常驻线程:JavaScript引擎线程,GUI渲染线程,浏览器事件触发线程。
JavaScript引擎是基于事件驱动单线程执行的,js引擎一直
等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个js线程在运行js程序。
GUI渲染线程负责浏览器界面的渲染,当界面需要重绘的时候或者由于某种操作引发回流时,该线程就会执行,需要注意GUI渲染线程与js引擎是互斥的,当js引擎执行的时候GUI线程会被挂起,GUI更新会被保存在一个队列中,等到js引擎空闲时立即被执行
事件触发线程,当一个事件被触发时该线程会把事件添加到待处理的队列末尾,等待js引擎的处理。这些事件可来自js引擎当前执行代码块,如setTimeout,也可来自浏览器内核的其他线程如鼠标点击、ajax异步请求等,但由于js的单线程关系所有这些事件都得排队等待js引擎处理。
当线程中没有任何同步代码的前提下才会执行异步代码。
--以上信息来源于https://www.zhihu.com/people/fredshare。
在上题中setTimeout是异步的代码,即使setTimeout中设置的等待时间为0也不会立刻执行,for循环代码是同步,所以要等待for循环执行完以后才会执行setTimeout。因此此时如果使用传统的for循环,在setTimeout中打印a[i]的话会出现undefined的情况。此时可以在for循环外定义一个局部变量j。打印的时候打印a[j++]就可以实现a数组的遍历
代码如下:
var a=[1,2,3,4];
var i,len=a.length;
var j=0;
for(i=0;i<len;i++){
setTimeout(function(){
console.log(a[j++]);
},100);
}
var a=[1,2,3]; var len=a.length; for(___){ setTimeout{function(){ console.log(__); },100} }
要求输出a的所有项。
该题目考察的就是JavaScript的单线程以及setTimeout的异步特性。
【注】:JavaScript引擎是单线程运行的,浏览器运行期间只有一个线程在运行js程序。浏览器的内核是多线程的,他们在内核控制下相互配合,以保持同步,一个浏览器至少实现三个常驻线程:JavaScript引擎线程,GUI渲染线程,浏览器事件触发线程。
JavaScript引擎是基于事件驱动单线程执行的,js引擎一直
等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个js线程在运行js程序。
GUI渲染线程负责浏览器界面的渲染,当界面需要重绘的时候或者由于某种操作引发回流时,该线程就会执行,需要注意GUI渲染线程与js引擎是互斥的,当js引擎执行的时候GUI线程会被挂起,GUI更新会被保存在一个队列中,等到js引擎空闲时立即被执行
事件触发线程,当一个事件被触发时该线程会把事件添加到待处理的队列末尾,等待js引擎的处理。这些事件可来自js引擎当前执行代码块,如setTimeout,也可来自浏览器内核的其他线程如鼠标点击、ajax异步请求等,但由于js的单线程关系所有这些事件都得排队等待js引擎处理。
当线程中没有任何同步代码的前提下才会执行异步代码。
--以上信息来源于https://www.zhihu.com/people/fredshare。
在上题中setTimeout是异步的代码,即使setTimeout中设置的等待时间为0也不会立刻执行,for循环代码是同步,所以要等待for循环执行完以后才会执行setTimeout。因此此时如果使用传统的for循环,在setTimeout中打印a[i]的话会出现undefined的情况。此时可以在for循环外定义一个局部变量j。打印的时候打印a[j++]就可以实现a数组的遍历
代码如下:
var a=[1,2,3,4];
var i,len=a.length;
var j=0;
for(i=0;i<len;i++){
setTimeout(function(){
console.log(a[j++]);
},100);
}
相关文章推荐
- 使用Python进行稳定可靠的文件操作详解
- VBA添加表格
- 《CSS权威指南》基础复习+查漏补缺
- 关于缓存的一些问题!请大牛指点!
- 【转载】 android 圆角圆形图片ShapedImageView不到100行代码
- O365 Onedrive使用手册
- 最简实例说明wait、notify、notifyAll的使用方法
- js鼠标滚轮放大缩小图片
- 单例模式
- C++_友元函数
- SCOJ 4493: DNA 最长公共子串 后缀自动机
- mysql中怎么实现oracle中的to_char和to_date
- mule学习2
- source insight 中文乱码的解决方案
- 模式识别的评价方法:ROC曲线, DET曲线, FPPW, FPPI
- js 格式化日期
- allegro reuse功能
- 存储过程简介
- (六)6.15 Neurons Networks Deep Belief Networks
- jQuery实现AJAX定时刷新局部页面实例