讨论下关于 let 的那些事

2020-02-03 17:24:29 +08:00
 hjm

据大家所知

for (let i = 0; i < 2; i++) {
	console.log(i);
	for (i = 0; i < 8; i++) {
		console.log('>'+i);
	}
}

结果是

0
>0
>1
>2
>3
>4
>5
>6
>7

for (let i = 0; i < 2; i++) {
	console.log(i);
	for (let i = 0; i < 8; i++) {
		console.log('>'+i);
	}
}

结果是

0
>0
>1
>2
>3
>4
>5
>6
>7
1
>0
>1
>2
>3
>4
>5
>6
>7

第二个 for 的 let 发生了什么😉

1950 次点击
所在节点    JavaScript
4 条回复
rabbbit
2020-02-03 17:39:47 +08:00
把 for 后面那个括号当成是个作用域
第一个
let i = 0;
while(i < 2) {
....console.log(i);
....{
........i = 0; // 注意这里
........while(i < 8) {
............console.log('>'+ i)
............i++
........}
....}
....i++
}

第二个
let i = 0;
while(i < 2) {
....console.log(i);
....{
........let i = 0;
........while(i < 8) {
............console.log('>'+ i)
............i++
........}
....}
....i++
}
optional
2020-02-03 17:42:17 +08:00
let 是块级作用域。 第二个发生了变量覆盖。
royzxq
2020-02-04 15:07:42 +08:00
Pichai
2020-02-06 14:52:47 +08:00
```
for (let i = 0; i < 2; i++) {
console.log(i);
for (i = 0; i < 8; i++) { 此处没有使用关键字进行变量声明,i 就是全局作用域
console.log('>'+i);
}
}
代码相当于:

var i; // i 提升到所有代码最上方

for (let i = 0; i < 2; i++) {
console.log(i);
for (i = 0; i < 8; i++) {
console.log('>'+i);
}
}

for (let i = 0; i < 2; i++) {
console.log(i);
for (var i = 0; i < 8; i++) { //此处使用 var 进行变量声明,i 变量提升到块级外
console.log('>'+i);
}
}
代码相当于
for (let i = 0; i < 2; i++) {
var i; //此时代码变量提升到 for 的大括号外,出现重复定义。let 不允许变量重复
console.log(i);
for (i = 0; i < 8; i++) {
console.log('>'+i);
}
}


```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX