代码:

 var val1=0;
var val2=0;
var val3=0; for(var i1=1;i1<=3;i1++){
var i2=i1;
(function(){
var i3=i2;
setTimeout(function(){
val1+=i1;
val2+=i2;
val3+=i3;
},1);
})();
} setTimeout(function(){
console.log(val1);
console.log(val2);
console.log(val3);
},100)

问题:请写出该段代码打印出的结果。

正确答案:12,9,6

解析:setTimeout中的函数会在该段代码运行完之后运行,这是因为Javascript是单进程的,是事件循环模式运行的,setTimeout是将其中的函数在设定的时间之后加入到时间循环队列中,加入到队列之后还需要等待当前执行的函数同步代码执行完之后,才能执行通过setTimeout加入到队列的函数。然后再看i1,i2,i3,由于var是函数级作用域的,因此,i3在每次的匿名函数中都会重新定义,它的作用域只在当前的匿名函数中,因此最后的setTimeout函数中使用的i3是1、2、3,i2和i1都位于全局作用域中,不同的是i1最后比i2多加了一次,因此i1最后的值为4,i2最后的值为3。所以val1=3*i1=12,val2=2*i2=9。

最新文章

  1. web应用和虚拟目录映射
  2. Spark 常用参数及调优
  3. linux笔记六-------文件权限设置
  4. phpcms v9无法连接数据库服务器,请检查配置
  5. kali 重置 mysql 密码
  6. VShell破解版
  7. XML CDATA
  8. Hibernate 关联查询 相关错误
  9. mongodb数据库调试问题:‘db object already connecting, open cannot be called multiple times’
  10. yield return in C#
  11. Debug with Eclipse
  12. IIS虚拟目录与UNC路径权限初探
  13. HDU1421搬寝室(简单DP)
  14. zoj3321 circle floyd 最小生成树
  15. 个人的MySql配置总结
  16. Mongo查询关键字
  17. .Net高并发解决思路(附源码)
  18. Mysql中存储引擎区别【 InnoDB、MyISAM】
  19. wordpress使用阿里云邮件推送服务实现发送邮件
  20. Java内存模型与线程安全

热门文章

  1. magento 安装
  2. Android四大组件之Activity
  3. sql rank()函数
  4. Hadoop基础知识
  5. Ubuntu 下安装 MySQL Workbench
  6. Leetcode: Line Reflection
  7. DevExpress 为TextEdit设置水印文字
  8. csuoj 1117: 网格中的三角形
  9. Windows api实现桌面任务栏隐藏\显示
  10. LinuxStudyNote