Skip to content

var,let and const

Published: at 12:00 AM


let:(1)它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 for example:

    {
      let a = 10;
      var b = 1;
    }
    a // ReferenceError: a is not defined.
    b // 1

    var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6]();    //10,因为var全局有效所以后一个值会覆盖前一个值。

    var a = [];
    for (let i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6]();  //6,因为每个i只在所在块内有效。那是是不是可以在有些场景下用let替代计数器呢?


(2)不存在变量提升。

    console.log(foo); // 输出undefined
    console.log(bar); // 报错ReferenceError

    var foo = 2;
    let bar = 2;


(3)暂时性死区

    var tmp = 123;

    if (true) {
      tmp = 'abc'; // ReferenceError,因为块级作用域内let又声明了一个局部变量tmp,
      导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
      let tmp;
    }


纠正阮老师ES6入门书籍的错误。

    {
      let a = 'secret';
      function f() {
        return a;
      }
    }
    f(); // 报错    (但是在chrome运行后,这个是可以返回结果的,“secret”)

    let f;
    {
      let a = 'secret';
      f = function () {
        return a;
      };
    }
    f(); // "secret"    (这个反而是错的,运行后console报错,f重复定义



const:const一旦初始化就不能在对其值做出更改了,有种情况比较特殊,需要注意,那就是如果初始化为对象的话,那么可以改变对象key,value中的value,因为对对象的应用还是没有改变的。例如:

    const foo = { bar: 'baz' };
    foo.bar = 'boo'

是不会报错的。