作者:Ahmad shaded
译者:前端小智
起源:sitepoint
有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。
‘ 晋升 ’ 是 JS 开发都常常接触的一个术语,如果你刚接触 JS,可能会遇到一些奇怪的行为,其中一些变量是随机undefined
,会抛出ReferenceErrors
异样等等。晋升通常被解释为将变量和函数放到作用域顶部,但实际上并不是这样,只管行为看起来是这样的。
当 JS 引擎获取咱们的代码时,它要做的第一件事就是为代码中的数据 设置内存。目前还没有执行任何代码,只是筹备要执行的所有内容。函数申明和变量的存储形式不同。函数是以按保留函数的援用的形式来存储。
1. 函数是以按保留函数的援用的形式来存储(Functions
are stored with a reference to the entire function
)
应用变量,则有所不同。ES6 引入了两个新的关键字来申明变量:let
和 const
。用let
或const
关键字申明的变量保留的状态是 uninitialized
。
2. 用 let
或const
关键字申明的变量保留的状态是 uninitialized
应用 var
关键字申明的变量存储的默认值为undefined
。
当初创立阶段曾经实现,咱们能够执行代码。让咱们看看在申明函数或任何变量之前,如果顶部执行 3
个console.log
语句会产生什么。
因为函数存储在对整个函数代码的援用中,所以咱们能够在创立它们的行之前调用它们。
4. 在执行阶段,咱们能够在申明函数之前调用它们,因为咱们在内存中援用了整个函数(During the execution phase,
we can invoke a function
before we declared them, since we a reference to the entire function in memory)
当咱们在变量申明之前援用 var
关键字申明的变量时,它只会返回其存储时的默认值:undefined
。然而,这有时会导致“意料之外”的行为。在大多数状况下,咱们有可能会无心中从新援用了它(你可能不心愿它的值为undefined
)
5. 当咱们在变量申明之前援用 var
关键字申明的变量时,它只会返回其存储时的默认值:undefined
为了避免意外援用 undefined
的变量,就像咱们能够应用 var 关键字一样,每当咱们试图拜访
未初始化 (uninitialized) 的变量时,都会抛出一个
ReferenceError。在它们理论申明之前的“区域”称为 ** 长期死区 **: 不能在它们的初始化之前援用变量(这也包含
ES6 类 `)
6. 每当咱们试图拜访 未初始化 (uninitialized)
的变量时,都会抛出一个 ReferenceError
。在它们理论申明之前的“区域”称为 长期死区 **
当引擎通过咱们理论申明变量的那一行时,内存中的值会被咱们理论申明的值笼罩。
总结
- 在执行代码之前,函数和变量存储在内存中,用于执行上下文,这就是所谓的晋升。
- 函数存储为对整个函数的援用,用
var
关键字申明的变量默认值为undefined
,用let
和const
关键字申明变量默认存储值为uninitialized
。
心愿本文对你有所帮忙,感激浏览。
原文:https://dev.to/lydiahallie/ja…
代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。
交换
有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
本文 GitHub https://github.com/qq44924588… 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。