美文网首页
2. let 和 const 命令

2. let 和 const 命令

作者: yezide | 来源:发表于2018-06-16 16:47 被阅读0次

    一、let

    1、let命令

    用法类似于var,但是它所声明的变量,只在let命令所在的代码块内有效。
    如下代码,是个大坑,因为i被认为是全局变量,输出10

    var a = [];
    for (var i = 0; i < 10 ; i++) {
        a[i] = function() {
            console.log(i);
        }
    }
    
    a[6]();
    

    原因: 变量i是var命令声明的,在全局范围内都有效,所以a[i]都指向同一个对象
    疑点:
    1、 i为什么不是9? 测试了下,因为a[i]是个function,最后i=9时又做了++,所以是10

    把var 改成let之后,就正常了,因为let让i变成了for里面的局部变量

    2、 let要求先定义后使用

    否则报“ ReferenceError”

    3、隐蔽的误区

    如下代码,因为y未被先定义

    function bar(x = y, y = 2) {
      return [x, y];
    }
    
    bar(); // 报错
    

    4、let不允许在相同作用域内,重复声明同一个变量。

    5、块级作用域

    二、const

    1、 常量的意义:指针地址不变

    const的作用域与let命令相同:只在声明所在的块级作用域内有效。
    const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动

    const foo = {};
    
    // 为 foo 添加一个属性,可以成功
    foo.prop = 123;
    foo.prop // 123
    
    // 将 foo 指向另一个对象,就会报错
    foo = {}; // TypeError: "foo" is read-only
    

    2、实现真的const

    如果真的想将对象冻结,应该使用Object.freeze方法

    const foo = Object.freeze({});
    
    // 常规模式时,下面一行不起作用;
    // 严格模式时,该行会报错
    foo.prop = 123;
    

    三、一些总结

    1、 用let和const定义的变量,不再属于全局对象(window或global)

    var a = 1;
    console.log(window.a);
    
    let b = 1;
    console.log(window.b);
    

    相关文章

      网友评论

          本文标题:2. let 和 const 命令

          本文链接:https://www.haomeiwen.com/subject/mzybeftx.html