首页 > 代码库 > js典型题--从闭包开始
js典型题--从闭包开始
一个不起眼的开始
for(var i=0;i<5;i++){ setTimeout(function () { console.log(i) },1000) } console.log(i) //5 5,5,5,5,5
这里涉及到javascript的单线程异步机制,详细介绍见 http://blog.csdn.net/alex8046/article/details/44494859
javascrip是单线程语言,所有异步事件(计时器、鼠标事件、ajax...)在所有时间执行完毕之后才能执行,并且单线程事件几乎在同一时间内执行完毕,因此,在for循环结束后,i已经变为5,而settimeout事件在1秒之后输出5个5。
如果希望输出值变为 5 0,1,2,3,4 改如何进行改进?
1.闭包,将变量保存
for(var i=0;i<5;i++){ (function (j) { //闭包,j=i setTimeout(function () { console.log(j) },1000) })(i) } console.log(i)
2.循环体内进行函数传参,保留变量
var fn=function (i) { setTimeout(function () { console.log(i) },1000) } for(var i=0;i<5;i++){ fn(i) } console.log(i)
js典型题--从闭包开始
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。