Javascript学习笔记:闭包题解(4)
2016-04-12 22:53
423 查看
代码:
问题:请写出该段代码打印出的结果。
正确答案: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。
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。
相关文章推荐
- defaultGlobalVar.js
- Js中Dom对象,控制Html元素
- 【新人笔记16.04.12】JS--枚举属性
- javascript事件详解笔记
- 菜单栏展开
- js倒计时(附js date操作)
- JavaScript当中的eval函数
- JS中Attribute 和 property的区别
- JS实现循环给元素绑定事件的几个常用方法
- 20160412jsp学习笔记简单了解jsp
- 有向图中Dijstra最短路径算法的邻接表实现
- 【数据存储】——JSON与XML的对比
- javascript copy拷贝对象
- jsp用到的标签
- 【数据存储】——JSON的解析和生成
- JSON知识总结
- json-lib
- JavaScript 正则表达式
- JavaScript 引用类型
- javascript正则表达式分组-捕获性分组/非捕获性分组/正则前瞻