关于闭包与for循环的理解
2016-01-30 16:29
363 查看
function createFunction1(){ for(var i=0;i<5;i++){ function s(){ console.log(i); } s(); } } createFunction1(); //0 1 2 3 4;
以上是一个正常的函数。
function createFunction2(){ for(var i=0;i<5;i++){ setTimeout(function timer(){ console.log(i); },i*1000); } } createFunction2(); //每隔1秒输出‘4’、共输出5次
并不会按照我们预想的每隔1秒分别输出0、1、2、3、4
分析一下原因:
此函数在for循环的第一层是setTimeout函数,他的执行和createFunction1中的s函数一样,将按分别在1秒后、2秒后、3秒后执行。但这儿需要注意的是,setTimeout的内部函数timer并没有立即执行,for循环中的i将会把值分别赋给setTimeout外部参数中的i,但其内部函数timer()则只会引用包含函数setTimeout()中的变量的最后一个值。因为闭包所保存的是整个变量对象,而不是某个特殊的变量。当然其中的这些处理变化,都是瞬间完成的,与执行时间并无关系,即使把1000改成0效果还是一样的。
重写一下这个函数:
function createFunction3(){ for (var i=0;i<5;i++){ (function(j){ setTimeout(function timer(){ console.log(j); },i*1000); })(i); } } createFunction3(); //每隔1秒分别输出0 1 2 3 4
再看上面这个例子,给外部包装了一个立即执行的匿名函数,setTimeout里面的匿名函数不再引用外部函数的参数,而是直接引用外部匿名函数的参数,这时,一切就会按照我们预想的来执行了。
相关文章推荐
- Handlebars.js 模板引擎
- 自定义ImageView实现地图(一)
- 设计模式六大原则之Liskov替换原则
- LVS负载均衡介绍
- mysql index
- H-Index
- git add时候报错:LF will be replaced by CRLF
- 100. SimpleXML
- android webview用法小结
- ubuntu如何分区
- poj1308
- 层叠样式表——CSS
- HDU 1069 I Think I Need a Houseboat(模拟)
- MySQL复制的三种架构
- Vim加入文档声明信息
- 【Linux入门学习之】vi/vim编辑器必知必会
- 用C语言编写杨辉三角
- openstack学习笔记(一)-openstack的基础知识
- Java虚拟机-类加载器和类加载过程
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)--C. Constellation