let、const和var的区别

105 阅读2分钟

let、const 和 var 的区别

在JS中,var、let和const都是用来声明变量的关键字。
他们的区别是:

  1. 变量作用域:
    ES5中的作用域有 1.全局作用域,2.函数作用域。
    ES6中的作用域有 1.全局作用域,2.函数作用域 3.块级作用域。
    什么是块级作用域? 就是在 {} 中的部分,比如for循环、if条件语句的 if(true) {}。 var 变量声明,没有块的概念,可以垮块访问,不能跨函数访问。 let 和 const 变量声明,不能跨块作用域访问,也不能跨函数访问,不可以重复声明。

  2. 变量提升:
    var 声明变量会有变量提升。声明的变量会被挂载到全局对象 window 上。 let 和 const 没有变量提升。声明的变量不会被挂载到 window 对象上。

变量名提升 可以理解为未定义就使用

// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

挂载window

var a = 1;
window.a; // 1

let b = 1;
window.b; // undefined
  1. 暂时性死区:
    let 和 const 声明的变量在声明之前存在一个暂时性死区,也就是在所在作用域中无法访问到他们。在变量声明之前对其进行访问会抛出一个引用错误。
var tmp = 123; // 声明
if (true) {
  tmp = 'abc'; // 报错 因为本区域有tmp声明变量
  let tmp; // 绑定if这个块级的作用域 不能出现tmp变量
}

  1. 变量重新赋值:
    var和 let 变量可以重新赋值。 const 声明的变量是常量,在定义的时候必须赋值,一旦赋值,就不能再改变其值。如果赋值类型是引用类型(数组、对象)引用地址不能更改,内部数据可以更改。
var a;
let b;

const c = '赋值';

参考资料
es6.ruanyifeng.com/#docs/let
github.com/Advanced-Fr…
juejin.cn/post/684490…