var、let 和 const
介绍
var
console.log(a); // undefinedvar a = 1;/* --------等价于------- */var a;console.log(a); // undefineda = 1;
- 可以多次声明,后面的声明会覆盖前面的
var a = 1;var a = 2;console.log(a); // 2
- 只有函数作用域,没有块级作用域
/*------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
- 不存在变量声明提升(暂时性死区)
红宝书:在解析代码时,JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方式来引用未声明的变量。在 let 声明之前的执行瞬间被称为”暂时性死区“,在此阶段引用后面才声明的变量都会抛出 ReferenceError。
/* ----暂时性死区场景----*/var a = 1; // 声明if (true) { a = 2; // 报错 因为本区域有tmp声明变量 let tmp; // 绑定if这个块级的作用域 不能出现tmp变量}
- 不能重复声明
let a = 1;let a = 2;console.log(a); // Uncaught SyntaxError: Identifier 'a' has already been declared
- 具有块级作用域
let a = 1;{ let a = 2; console.log(a); // 2}console.log(a); // 1
const
const 与 let 基本相同
- 声明变量时必须进行初始化
const a; // Uncaught SyntaxError: Missing initializer in const declarationa = 1;
- 一旦声明变量后,变量的之就不能改变(注意:对象的属性可以改变,对象的引用地址不能改变)
const a = 1;a = 2; // Uncaught TypeError: Assignment to constant variable.
主要区别
- var 有变量声明提升,let/const 有暂时性死区
- var 只有函数作用域,let/const 还有块级作用域
- var 可以重复声明,let/const 不可以
- 不能修改使用 const 声明的变量
- let/const 声明的变量不会挂在顶层对象上