var
在ES5阶段,用var定义变量,此阶段具有以下特点:
- 1.没有块的概念,可以跨块访问,不能跨函数访问
- 2.存在变量提升
// 代码没报错,而是打印出来了undefined,侧面说明了val变量存在变量提升
console.log(val); // undefined
var val = 1;
console.log(val); // 1
let
在ES6阶段,出现了块的概念,新增了块级作用域,同时新增了let命令,let声明的变量具有以下特点:
-
1.let声明的变量只在它所在的代码块有效
-
2.不存在变量提升。let不会像var那样会发生‘变量提升’现象,因此,变量需要先声明后再使用,否则会报错
-
3.不允许重复声明。
-
4.暂时性死区。在代码块内,使用let命