作用域概念(Scope) : 变量可以起作用的范围区域
1.1ES5 有两种作用域
a.全局作用域(Global Scope) : 函数外面声明的变量,称之为全局变量。 可以在页面任何地方被访问
全局变量生命周期 : 从页面加载 -> 到页面关闭
b.局部作用域(Local Scope) : 函数里面声明的变量,称之为局部变量。 只能在函数里面被访问
局部变量生命周期 : 从函数开始执行 -> 到函数执行结束
1.2 ES6 新增块级作用域
c.块级作用域(Block Scope) : (1)let/const关键字声明
(2) 大括号里面声明
块级变量声明周期 : 从大括号开始 -> 到大括号结束
什么是块级作用域?
任何一对花括号 {} 中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
什么是函数作用域?
定义在函数中的参数和变量在函数外部是不可见的。
var 与 let const区别
1,变量的挂载不同
var 声明的变量会挂载在 window 上,而 let 和 const 声明的变量不会
let 、const 声明的变量会处于当前作用域中<script>
2,有无变量提升
var 声明变量存在变量提升
let 和 const 不存在变量提升
3,能否重复声明
同一作用域下 var 可以声明同名变量
同一作用域下 let和const不能声明同名变量
4,是否有块级作用域
ES5 是没有块级作用域概念的,所以var声明自然没有
let 和 const 声明形成块级作用域
5,const声明注意事项
一旦声明必须赋值,不能用 null 占位
声明一个常量,声明后不能再修改
如果声明的是复合类型数据,可以修改其属性
6,暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
如果在声明变量或常量之前使用它, 会引发 ReferenceError
, 这在语法上成为 暂存性死区
(temporal dead zone,简称 TDZ)。
由于let、const没有变量提升,才产生了暂时性死区