一道JS题目 财富值62

2016-10-14 14:14发布

for (var i=1;i<=5;i++) {                 setTimeout(function(){                     console.log(i)                 },i*1000)             } for循环语句是如何运行的呢?为什么会输出5个6呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答

判断当前i的值是否小于等于5,是的话就加1,因为你用了setTimeout,所以一秒后i的值已经变成6了,再输出的话,就一直是6了

function test(i){

一开始, 程序从for开始执行, 遇到setTimeout的时候先不管, 继续往后执行, 一直执行到循环结束.
好了, setTimeout可以执行啦. 连续六个setTimeout打印出i, 而此时的i已经是6啦.

输出的结果是:2.就是说{}中定义的变量i会取代{}外面的变量i,即没有块级作用域.

这是闭包问题,

mishen - whatsns产品经理
6楼-- · 2016-10-14 14:52

通过上面的代码,可以看出只定义了一个变量 i ,只有在循环里面赋值为1~5,循环结束后是 6
setTimeout中的代码是在循环之后执行的,所以输出的i是 6。而不是你所想的。
因为 i 只有一个,不可能同时等于 1,2,3,4,5.

可以改成(建议先理解上面一段代码,先不要纠结ES6的):

mishen - whatsns产品经理
8楼-- · 2016-10-14 14:54

闭包,闭包,闭包的问题!

段曼 - 我很好
9楼-- · 2016-10-14 14:54

}

这是由于js没有块级作用域造成的,而不是for循环的问题.