javascript图解之变量提升

javascript图解之变量提升

变量提升是每个JS开发人员都听说过的那些术语之一,因为您在Google上搜索了令人讨厌的错误并最终定位到*,这个人此错误是由于变量提升引起的????那么,变量提升是什么?(仅供参考- 范围将在另一篇文章中介绍,我希望使文章小而集中)

如果您不熟悉JavaScript,则可能会遇到“怪异”的行为,其中某些变量显示undefined,抛出ReferenceError错误等等。变量提升通常被解释为将变量声明和函数声明放在JS文件的顶部,但是又不是这样,这不是正在发生的事情,尽管行为看起来像这样。????

当JS引擎获取我们的脚本时,它要做的第一件事就是为代码中的数据分配设置内存。此时不执行任何代码,它只是为执行做好准备。函数声明和变量的存储方式是不同的。函数与对整个函数的引用一起存储。

javascript图解之变量提升

对于变量,则有所不同。ES6引入了两个新的关键字来声明变量:let和const。用let或者 const关键字声明的变量未初始化存储。

javascript图解之变量提升

使用var关键字声明的变量以默认值undefined存储。

javascript图解之变量提升

现在创建阶段已经完成,我们可以实际执行代码了。在声明函数或任何变量之前,让我们看看如果文件顶部有3个console.log语句会发生什么。

由于函数是与对整个函数代码的引用一起存储的,所以我们甚至可以在创建它们的行之前调用它们!????

javascript图解之变量提升

当我们引用一个在声明之前用var关键字声明的变量时,它只会返回它存储的默认值:undefined!然而,这有时会导致“意想不到”的行为。在大多数情况下,这意味着您无意中引用了它(您可能不希望它实际具有undefined的值)????

javascript图解之变量提升

为了防止意外地引用未定义的变量,就像使用var关键字一样,每当我们试图访问未初始化的变量时,都会抛出ReferenceError。在实际声明之前的“区域”称为暂时性死区:在初始化之前您不能引用变量(这也包括ES6类!)。

javascript图解之变量提升

当引擎通过我们实际声明变量的行时,内存中的值将被我们实际声明它们的值覆盖。

(糟糕,我现在注意到这应该是数字7。将尽快更新)。

javascript图解之变量提升

全做完了!????快速回顾:

  •     在执行代码之前,将函数和变量存储在内存中以用于执行上下文。这称为提升。
  •     函数存储是与对整个函数的引用一起存储,用var关键字声明的变量被初始化值undefined,用let和const关键字声明的变量被存储为uninitialized(未初始化),所以var提前引用值为undefined不会报错,let,const会报错

我希望变量术语一词的含义不再那么模糊,因为我们已经研究了执行代码时发生的情况。与往常一样,不要担心它是否仍然没有任何意义。您使用它的次数越多,您就会感到更加自在。随时向我寻求帮助,我很乐意为您服务!????