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

来源:互联网 发布:python pyqt教程 编辑:程序博客网 时间:2024/05/07 13:34

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

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);

结果则是:

111

如果你这么写,结果同上

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);}

结果:

20
0 0
原创粉丝点击