首先说明一下作用域在ES6只前只有两种作用域,ES6之后引用了块级作用域 {} 在块级作用域中用let定义的变量在外面是访问不了,
- ES6之前:
- 一种是全局作用域,
- 一种是函数作用域
- ES6之后:
- 一种是全局作用域,
- 一种是函数作用域
- 一种是块级作用域
var 声明变量的缺点
- 允许重复声明变量
- 变量的提升(产生闭包问题)
- 全局变量挂载到全局对象上面,导致全局对象成员污染
let声明
- let声明声明的变量不会挂载到全局对象
- let声明的变量在 当 前 作 用 域 \color{red}{当前作用域} 当前作用域不能重复声明
- let声明的变量不会有变量声明提升(所有就不能在变量声明之前使用 会报错:“Cannot access ‘qw’ before”。其实在let声明也会有变量声明提升,提升后会将其放入到
暂
时
性
死
区
\color{red}{暂时性死区}
暂时性死区,如果访问变量位于暂时性死区,就会报错“Cannot access ‘qw’ before”。当代码运行到变量声明语句的时候,会将变量重暂时性死区中移除)
在循环中使用let声明的变量在循环结束后是不能访问let声明的变量
const声明
const和let其他都相同,只有一点不相同const声明了变量就不能更改,所以我们也叫const为常量
在实际开发中,尽量使用const来声明变量 (因为开发中有很多变量都不会更改的,使用const就能避免出错)
//const 是可以更改引用类型数据里面内容
const a = {
name: '123',
age: '18'
}
a.name = '789'
//这样是不报错的因为改的不是a a在栈内存里面存的引用地址,数据存在堆内存里面a.name相当于是去改堆内存里面东西