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