这篇文章主要介绍“JavaScript中的变量提升实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的变量提升实例分析”文章能帮助大家解决问题。JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。然而JavaScript并不会移动你的代码,所以JavaScript中“变量提升”并不是真正意义上的“提升”。JavaScript是单线程语言,所以执行肯定是按顺序执行。但是并不是逐行的分析和执行,而是一段一段地分析执行,会先进行编译阶段然后才是执行阶段。在编译阶段阶段,代码真正执行前的几毫秒,会检测到所有的变量和函数声明,所有这些函数和变量声明都被添加到名为Lexical Environmen
t的JavaScript数据结构内的内存中。所以这些变量和函数能在它们真正被声明之前使用。因为函数声明在编译阶段会被添加到词法环境(Lexical Environment)中,当JavaScript引擎遇到sayHi()
函数时,它会从词法环境中找到这个函数并执行它。上面的代码实际上分为两个部分:var name
表示声明变量name
= 'John Doe'
表示的是为变量name
赋值为’John Doe’。只有声明操作var name
会被提升,而赋值这个操作并不会被提升,但是为什么变量name
的值会是undefined
呢?原因是当JavaScript在编译阶段会找到var
关键字声明的变量会添加到词法环境中,并初始化一个值undefined
,在之后执行代码到赋值语句时,会把值赋值到这个变量。所以函数表达式也不会被“提升”。helloWorld
是一个默认值是undefined
的变量,而不是一个function
。为什么会报一个ReferenceError
错误,难道let
和const
声明的变量没有被“提升”吗?事实上所有的声明(function, var, let, const, class)都会被“提升”。但是只有使用var
关键字声明的变量才会被初始化undefined
值,而let
和const
声明的变量则不会被初始化值。只有在执行阶段JavaScript引擎在遇到他们的词法绑定(赋值)时,他们才会被初始化。这意味着在JavaScript引擎在声明变量之前,无法访问该变量。这就是我们所说的Temporal Dead Zone,即变量创建和初始化之间的时间跨度,它们无法访问。如果JavaScript引擎在let
和const
变量被声明的地方还找不到值的话,就会被赋值为undefined
或者返回一个错误(const
的情况下)。举例:在编译阶段,JavaScript引擎遇到变量a
并将它存到词法环境中,但因为使用let
关键字声明的,JavaScript引擎并不会为它初始化值,所以在编译阶段,此刻的词法环境像这样:如果我们要在变量声明之前使用变量,JavaScript引擎会从词法环境中获取变量的值,但是变量此时还是uninitialized
状态,所以会返回一个错误ReferenceError
。在执行阶段,当JavaScript引擎执行到变量被声明的时候,如果声明了变量并赋值,会更新词法环境中的值,如果只是声明了变量没有被赋值,那么JavaScript引擎会给变量赋值为undefined
。tips:我们可以在let
和const
声明之免费云主机域名前使用他们,只要代码不是在变量声明之前执行:同let
和const
一样,class
在JavaScript中也是会被“提升”的,在被真正赋值之前都不会被初始化值, 同样受Temporal Dead Zone的影响。关于“JavaScript中的变量提升实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。
相关推荐: python深度学习tensorflow安装调试的方法
这篇文章主要介绍“python深度学习tensorflow安装调试的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python深度学习tensorflow安装调试的方法”文章能帮助大家解决问题。tensorflow…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。