var、let、const
用 var 声明的变量的作用域是它当前的执行上下文,即如果是在任何函数外面,则是全局执行上下文,如果在函数里面,则是当前函数执行上下文。换句话说,var 声明的变量的作用域只能是全局或者整个函数块的。
- 作用域
- 全局作用域
- 函数作用域:
function() {} - 块级作用域:
{}
- 作用范围
var命令在全局代码中执行const命令和let命令只能在代码块中执行
- 赋值使用
let命令声明变量后可立马赋值或使用时赋值const命令声明常量后必须立马赋值
- 声明方法:
var、const、let、function、class、import
let
有块级作用域:可以是全局或者整个函数块,也可以是 if、while、switch等用
{}限定的代码块。不存在变量提升
不存在重复定义:不允许在同一作用域中重复声明,否则将抛出异常
不可能提前使用。
const
固定的,一开始就要声明好,后面不能更改
const 声明的是一个只读变量,声明之后不允许改变其值
因此,const 一旦声明必须初始化,否则会报错。
const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动(即栈内存在的值和地址)。
const 只能保证指针是不可修改的,至于指针指向的数据结构是无法保证其不能被修改的(在堆中)。
变量提升与暂时性死区
var 声明变量,存在变量提升
变量提升:var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。
let 声明变量,存在暂存死区
暂时性死区:只要块级作用域内存在let声明,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。