var let const区别:

221 阅读2分钟

声明变量关键字:

var let const

var 特点:
(1)后面声明可覆盖前面的

(2)可变量提升(值为undefined)
let 特点:
1.不可重复声明

function func(arg) { let arg;// 报错 } func()

2.不存在变量提升

报错ReferenceError

3.暂时性死区 

定义:1.只在let命令所在的代码块内有效2.只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不在受外部的影响。

     eg: var tmp="123";
     if(true){
         tmp = 'abc';//ReferenceError  声明前不可使用,后者绑定这个块级作用域
         let temp;
     }

    "暂时性死区"也意味着typeof不再是一个百分之百安全的操作。
     (1)    typeof x; // ReferenceError
            let x;
            作为比较,如果一个变量根本没有被声明,使用typeof反而不会报错
            typeof undeclared_variable // "undefined"
     (2) 
             {
             let a = 10;
             var b = 1;
             }
             console.log(a);//a is not defined
             console.log(b);//1
     (3)
             for(let i=0;i<10;i++){
                //...
             }
             console.log(i);//i is not defined
     (4)
             var a=[];
             for(let i=0;i<10;i++){
                 a[i] = function(){
                     console.log(i);
                 }
             }
             a[6]();//6 当前的i只在本轮循环有效,JavaScript 引擎内部会记住上一轮循环的值

块级作用域

     (1)function f1() {
              let n = 5;
              if (true) {
                let n = 10;
              }
              console.log(n); // 5
            } 
     (2)ES6 允许块级作用域的任意嵌套。
        {{{{
          {let insane = 'Hello World'}
          console.log(insane); // 报错
        }}}};
     (3)内层作用域可以定义外层作用域的同名变量。
         {{{{
          let insane = 'Hello World';
          {let insane = 'Hello World'}
         }}}};
     (4)块级作用域的出现,匿名立即执行函数表达式不再必要了。
        // IIFE 写法
        (function () {
          var tmp = ...;
          ...
        }());
        // 块级作用域写法
        {
          let tmp = ...;
          ...
        }
     (5)允许在块级作用域之中声明函数,考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
     // 块级作用域内部的函数声明语句,建议不要使用
        {
          let a = 'secret';
          function f() {
            return a;
          }
        }
        
        // 块级作用域内部,优先使用函数表达式
        {
          let a = 'secret';
          let f = function () {
            return a;
          };
        }
     (6)ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域
const特点:

1.常量 不能被重新赋值

    const PI = 3.1415;
    PI // 3.1415
    PI = 3;
    // TypeError: Assignment to constant variable.

2.const一旦声明变量,就必须立即初始化,不能留到以后赋值

3.只在声明所在的块级作用域内有效

4.const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动

 (1)    const foo = {};
     // 为 foo 添加一个属性,可以成功
     foo.prop = 123;
     foo.prop // 123
     // 将 foo 指向另一个对象,就会报错
     foo = {}; // TypeError: "foo" is read-only
 
 (2) const a = [];
     a.push('Hello'); // 可执行
     a.length = 0;    // 可执行
     a = ['Dave'];    // 报错