2-6 练习题

来源:2-5 Let & Const

CatCian

2019-11-13

请问下面的代码输出是什么?如何能根据 i 的顺序输出?

for(var i=0; i<3; i++){
	setTimeOut(function(){
		console.log(i)
	}, 1000)
}

没明白什么意思,变量提升?还是啥,浏览器上试都是3,什么鬼?

写回答

2回答

king帅帅

2019-11-17

都是3是异步 + 全局作用域两者一起造成的,setTimeout是异步代码,js会先执行同步代码,也就是for循环,setTimeout放在异步队列中,三次for循环执行完毕之后,异步队列中三个setTimeout就开始执行,开始打印i,此时i已经是3,所以会打印3次3。 就算你将setTimeout的1000改为0,还是执行三次3。 

如果是let定义i,那么每次执行大括号时候,作用域是固定的,setTimeout被放入异步队列中的时候传递进去的i是这个块级作用域的i,所以值会被保护起来,三次for执行之后,开始执行异步队列的三个setTimeout, 每个setTimeout里面保存的i都是对应作用域里的i,所以会打印0, 1, 2

9
1
CatCian
非常清楚,谢谢
2019-12-06
共1条回复

快乐动起来呀

2019-11-13

这个是var和let的区别,试试改成let

0
0

再学JavaScript ES(6-10)全版本语法大全

前端无门槛学习,从ES6到ES10,一套课程掌握JS最新语法

1182 学习 · 336 问题

查看课程