- var
- let
- const
var
最早声明变量的方式,但存在两个问题。
声明提升
console.log(a); // undefined
var a = 1;
// 实际
var a;
console.log(a);
a = 1;
作用域污染
// 全局作用域
var a = 1;
function m(){
// 函数作用域
a = 2
}
m()
console.log(a) // 2
作用域
作用域包括全局作用域、函数作用域,es6新增了块级作用域({},if块,for块)
{
let a = 1;
}
console.log(a) // error a is not defined
var 的特性
- 没有块作用域的概念
{
var a = 1;
}
console.log(a) // 1
- 有全局作用域、函数作用域的概念
- 不初始化,默认值为undefined
- 存在
变量提升 - 全局作用域var声明的变量会挂载到window对象下
- 同一作用域
允许重复声明
let
let、const 解决了var之前存在的问题,let一般用于声明可变变量(开发中优先使用const进行声明,const不可用的情况下用let)
let 特性
- 有块级作用域的概念
{
let a = 1;
}
console.log(a) // error a is not defined
- 不存在变量提升
{
console.log(a) // cannot access 'a' before initialization
let a = 1;
}
- 暂时性死区
在词法环境中无法在变量声明之前,访问该变量
- 同一作用域
不允许重复声明
const
用于声明常量,推荐使用
const LIMIT = 100;
const obj = {
a:1
}
const test = ()={
//
}
const 特性
必须立即初始化
const a;// missing initializer in const delcaration
- 常量声明不支持修改
- 其他特性与let一致