看一个简单的例子:

 for(var i=0; i<4; i++){
setTimeout(function(){console.log(i)}, 0);
}

请问下这段代码会输出什么呢?

如果你觉得输出:

1

2

3

那你就错了,实际上它会输出

4

4

4

为什么是这个结果呢?这里给出的解释是:Javascript事件处理器是在线程执行完之后才执行事件,继续看下面的例子,你会更清楚:

var start = new Date();
setTimeout(function(){
var end = new Date();
console.log('多少秒之后才执行的setTimeout:', end - start, 'ms');
}, 500);
while(new Date() - start < 1000){}

如果按照多线程的思维定势,我们可能会觉得500毫秒之后函数就会执行,但是实际的结果可能会是:

多少秒之后才执行的setTimeout:1002 ms

如果要详细解释这个结果,我们可能还要看一下javascript中关于队列的解释。

因为javascript是单线程运行语言,所以当出现上面的代码运行的时候,javascript会先执行循环,把setTimeout事件放到事件队列里面,等待线程空闲,一旦线程空闲了,javascript会从事件队列中的底部堆栈中取出之前注册的事件执行,所以setTimeout会有很大的精度问题。

最新文章

  1. Windows10系统如何更改程序的默认安装目录?
  2. [python]爬虫学习(二)
  3. jquery源码中的(function(window, undefined){})(window)【转】
  4. 淘宝UWP桌面版已经发布
  5. POJ 2195:Going Home(最小费用最大流)
  6. Android系统版本与API Level对照表
  7. Javascript与Flash通信全解析
  8. Android微信SDK API 调用教程
  9. Hadoop1.1.2伪分布式安装笔记
  10. typedef与define的区别
  11. JPA 系列教程17-继承-独立表-TABLE_PER_CLASS
  12. 在阿里云ECS(CentOS6.5)上安装redis
  13. with与上下文管理器
  14. K8S flannel
  15. ini (ini-parser)配置文件解析 for donet
  16. go标准库的学习-os
  17. Pro Git
  18. 上传svn失败,代码冲突解决方式
  19. android中的数据库操作(SQLite)
  20. NPOI例子

热门文章

  1. 基础url、相对url、绝对url
  2. xtraTabbedMdiManager的标题上右鍵弹出关闭窗体菜单
  3. kubernetes中使用NFS创建pv_pvc
  4. 利用Aspose.BarCode生成条码
  5. HDUOJ----2159 FATE
  6. Java I/O 应用程序设计
  7. 【LeetCode】128. Longest Consecutive Sequence
  8. eclipse背景颜色调整参考(绿色养眼哟),其他工具也可以设置
  9. Android开发学习之数据存取
  10. python学习笔记012——locals与globals