> 文档中心 > var、let 和 const

var、let 和 const


介绍

var

  1. 存在变量声明提升
console.log(a); // undefinedvar a = 1;/* --------等价于------- */var a;console.log(a); // undefineda = 1;
  1. 可以多次声明,后面的声明会覆盖前面的
var a = 1;var a = 2;console.log(a); // 2
  1. 只有函数作用域,没有块级作用域
/*------example1--------*/var a = 1;function foo(){  var a = 2;  console.log(a);}foo(); // 2console.log(a); // 1/*------example2--------*/if (true) {  var a = 1;}console.log(a); // 1/*--------注意-------*/function foo() {  a = 1; // 不使用关键字会成为全局的 window 的属性,严格模式下报错}console.log(a); // 1

let

  1. 不存在变量声明提升(暂时性死区

红宝书:在解析代码时,JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行瞬间被称为”暂时性死区“,在此阶段引用后面才声明的变量都会抛出 ReferenceError。

/* ----暂时性死区场景----*/var a = 1; // 声明if (true) {  a = 2; // 报错 因为本区域有tmp声明变量  let tmp; // 绑定if这个块级的作用域 不能出现tmp变量}
  1. 不能重复声明
let a = 1;let a = 2;console.log(a); // Uncaught SyntaxError: Identifier 'a' has already been declared
  1. 具有块级作用域
let a = 1;{  let a = 2;  console.log(a); // 2}console.log(a); // 1

const

const 与 let 基本相同

  1. 声明变量时必须进行初始化
const a; // Uncaught SyntaxError: Missing initializer in const declarationa = 1;
  1. 一旦声明变量后,变量的之就不能改变(注意:对象的属性可以改变,对象的引用地址不能改变)
const a = 1;a = 2; // Uncaught TypeError: Assignment to constant variable.

主要区别

  1. var 有变量声明提升,let/const 有暂时性死区
  2. var 只有函数作用域,let/const 还有块级作用域
  3. var 可以重复声明,let/const 不可以
  4. 不能修改使用 const 声明的变量
  5. let/const 声明的变量不会挂在顶层对象上

组词