两道经典的面试题,直接上代码

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

会输出什么呢?先想一想,记下答案。继续下一题

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

改动很少,结果却相差甚远。先公布正确答案,第一段代码输出:1,2,4,8; 第二段代码输出:3,6,12,24。

意不意外?刺不刺激?惊不惊喜?

【代码解析】

  首先,不要被定时器干扰,误以为它有延迟才会导致这样的结果,你可以尝试把延迟改成“0”或者去掉不写,结果依然相同。

  引入一个概念-->异步,脱离当前事件队列的处理程序,而且必须等到正常队列里的事件完成后才会执行。

    再来分析以上代码,

     第一个,看到setTimeout,就知道知道它会在代码块的for循环及最后一个console.log完成后才执行,而且执行三次。毫无疑问,会先输出1,此时 i 的值为 1,再开始执行setTimeout进程,分别输出2,4,8.

       第二个,需要对闭包有一定理解,js中的for循环是不存在私有作用域的,所以for循环最后结束时 i = 3,然后再执行setTimeout,依次是6,12,24.

最新文章

  1. SDK接入(U8SDK)——SDK抽象层的设计
  2. 树形DP习题
  3. java 泛型接口示例
  4. js中的this中使用
  5. 漫谈Java虚拟机(JVM)
  6. PHP分页
  7. Java Web编程的主要组件技术——Struts的高级功能
  8. poj 1487 Single-Player Games
  9. 关于Git的stash命令
  10. Zend框架2入门(一) (转)
  11. .NET Reflector 8.3.3.115 官方最新版+注册机(强大的.NET反编译工具破解版)
  12. ubuntu14.04 下安装mysql5.6
  13. oracle数据库兼容mysql的差异写法
  14. tsung压力测试——tcp测试tsung.xml配置模版说明
  15. 小程序wxss和css3的区别
  16. lua continue实现
  17. 【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理
  18. JS 文本框格式化
  19. 第六次spring会议
  20. python全栈开发day20-类的三大特性继承、多态、封装

热门文章

  1. sql中 datediff的使用
  2. java多线程基本概述(二)——Thread的一些方法
  3. 如何用unity3d实现发送带附件的邮件
  4. Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)
  5. Block Token 原理分析
  6. [ext4]04 磁盘布局 - Meta Block Groups
  7. Java中多线程同步类 CountDownLatch
  8. TypeScript入门-枚举、类型推论
  9. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
  10. LeetCode:36. Valid Sudoku,数独是否有效