let与for

    正常的var与for:

    1. var a = [];
    2. for (var i = 0; i < 10; i++) {
    3.     a[i] = function () {
    4.         console.log(i);
    5.     };
    6. }
    7. a[6](); // 10

    let与for:

    1. var a = [];
    2. for (let i = 0; i < 10; i++) {
    3.     a[i] = function () {
    4.         console.log(i);
    5.     };
    6. }
    7. a[6](); // 6

    var和for一起使用的时候,变量只有一个,不存在作用域,但是let和for一起使用的时候,实际上就有两层作用域,for小括号里面的为外层作用域,大括号内为内层作用域。结构大致如下:

    1. {
    2.     let i = 0; // i作用于这个大区块
    3.     {
    4.         //let i = 'abc'; // i作用于这个小区块
    5.         console.log(i);
    6.     }
    7. }

    这种结构,如果内层用let重新定义一个i也是没关系的:

    1. for (let i = 0; i < 10; i++) {
    2.     let i='a';
    3.     console.log(i);
    4. }

    注意,这里内部用let定义是可以的,因为let是以大括号为作用域的,如果使用var就会报错,因为var会先将变量提升,然后let这里就会报变量已存在的错误。

    1. //注意,这是错误的代码,因为var会先将i提升,然后let报错
    2. for (let i = 0; i < 10; i++) {
    3.     var i='a';
    4.     console.log(i);
    5. }

    这种错误情况的结构大致如下:

    1. {
    2.     let i = 0; // i作用于这个大区块
    3.     {
    4.         var i = 'abc'; // 此处的i也作用于这个大区块
    5.         console.log(i);
    6.     }
    7. }

    暂时性死区

    let/const变量在定义前不能被使用:

    1. //情况1
    2. typeof x; // ReferenceError
    3. let x;
    4. //情况2
    5. console.log(y);// ReferenceError
    6. let y;
    7. //情况3
    8. let x=x;// ReferenceError
    9. //情况4
    10. function bar(x=y,y=2){}
    11. bar();//报错

    注意上面的bar(x=y,y=2){},参数上的声明用的其实是let,因为y在声明前使用了,所以报错。

    变量声明

    相同作用域下,let声明后,不能再用let和var声明,但是可以直接声明,例如let a=10;a=20;是可以的。

    回到顶部
    我要评论

    所有评论

      相关文章