ES6 中 let的在for循环中变量作用域问题的探讨

如果你直接这么运行,那么电脑就卡死了,因为死循环了。

for (var i = 0; i < 3; i++) {
    var i = 1;
  console.log(i);
}

可是如果你这么写

for (let i = 0; i < 3; i++) {
  let i = 1;
  console.log(i);

结果则是:

1
1
1

如果你这么写,结果同上

for (var i = 0; i < 3; i++) {
  let i = 1;
  console.log(i);
}

如果你这么写,会报错

for (let i = 0; i < 3; i++) {
  var i = 1;
  console.log(i);
} // SyntaxError: Identifier 'i' has already been declared

这是因为let在for循环语句中是父作用域。循环体内部是子作用域。
所以如果我们用let在for循环体内部用i定义变量的话,那么妈妈再也不用担心我敲电脑敲出死机了。

当然如果你在循环体内部直接运用i也是可以的,这样 i 会直接运用到子作用域。

for (let i = 0; i < 3; i++) {
  console.log(i);
}

如果你这么写,也是会报错,因为对于var来讲它是不会区分循环体内部和循环语句的变量作用域的。

for (let i = 0; i < 3; i++) {
  var i = 0;
  console.log(i);
} // SyntaxError: Identifier 'i' has already been declared

再写个let在块级作用域的例子,我们一起来感受下:

{
    let i = 0;
    if (true) {
        let i = 2; 
        console.log(i);
    }
    console.log(i);
}

结果:

2
0
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值