状态提升
-
在ES6之前,JavaScript只有经典的var声明,这给开发者带来了很多的困扰。在ES6出现后,又增加了let和const关键字的声明方式。这里会讲有关变量声明,作用域,状态提升相关知识。
-
在JavaScript的世界里,作用域可以分为三种,分别是全局作用域,函数作用域,块级作用域。
-
全局作用域/执行上下文:默认或者是最基础的作用域。一个程序只有一个全局作用域,在JavaScript脚本存在的生命周期中都在执行堆栈的底部不会被弹出销毁。全局作用域中有一个全局对象(以浏览器环境为例,这个全局对象是window)
-
函数作用域:一个函数体内部是一个作用域。
-
块级作用域:存在于块中——字符 { 和 } 之间的区域。(显然函数体也是由大括号包裹的,所以函数作用域也是块级作用域)
-
- var声明的变量会被提升到当前作用域顶部(当前作用域只包括全局作用域或函数作用域,没有块级作用域)
-
- const 和 let 是块级标识符,所以声明的变量、常量也只在当前代码块中有效,一旦执行到块外就会立即被销毁。
-
let声明:可以将变量作用域限制在当前代码块中。在声明语句前会将变量放在临时死区。(let定义变量)
-
const声明:用来声明常量,并且每个被被const声明的常量必须进行初始化。如果是对象,则对象中的值可以修改(cosnt声明不允许修改绑定,但可以修改绑定的值)(const定义常量)
-
临时死区(Temporal Dead Zone,TDZ):用来描述 let 和 const 的不提升效果的术语。JavaScript引擎在扫描代码发现变量声明时,要么将他们提升到作用域顶部(var声明),要么将声明放到TDZ(let声明和const声明)。访问在TDZ中的变量会触发运行时错误,只有执行过变量声明语句后,变量才会从TDZ中移出,然后才可以正常访问。
-
var 声明的变量会提升到当前作用域顶部,在实例化之前为 undefined。var声明的变量限制范围为全局作用域或函数作用域。
块级声明的变量会被存放到临时死区,在实例化前访问会报错 Uncaught ReferenceError
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构