ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

let 到底有无变量提升

2022-02-22 14:59:11  阅读:173  来源: 互联网

标签:初始化 执行 变量 let 有无 上下文 声明


<script type="text/javascript">
			var a = 456;
			(function() {
				console.log(a)
				let a=123
			})()
		</script>

如果let没有变量提升的话输出的应该是456

但是如果你执行代码的话会报错Uncaught ReferenceError: a is not defined

但是现在不会报这个错他会报 Cannot access 'a' before initialization 初始化前无法访问“a”

之所以会报不一样的错误是因为浏览器版本不同

想不到吧!从这里其实可以看出let存不存在变量提升有争议了,值在变量显式赋值之前不能对变量进行读写,否则就会报错,这也就是所谓的let和const的暂时性死区

暂存死区

与通过  var 声明的有初始化值 undefined 的变量不同,通过 let 声明的变量直到它们的定义被执行时才初始化。在变量初始化前访问该变量会导致 ReferenceError。该变量处在一个自块顶部到初始化处理的“暂存死区”中。

看过很多文章后用大佬的话做下总结

①let有无变量提升取决于你如何定义变量提升。

②若[变量提升」是指变量可在声明语句之前被调用,则let没有变量提升;若[变量提升」是指变量在声明语句之前就被执行上下文记住,则let有变量提升。

③JS代码是即时编译与执行的,一个函数作用域会拥有一个执行上下文,执行上下文是一块存储空间。执行上下文内又有一个名为[变量环境」和「词法环境」的东西。

④由var和function声明的变量,在代码编译完成后,执行之前,其变量名和值就被存储在变量环境中了,所以在代码执行阶段的任何时刻,都可以调用它们,自然也能在声明语句之前调用了。

⑤由const和let声明的变量,在代码编译完成后、执行之前,其变量名被存储在词法环境中,代码执行过程中会从依据[词法环境→变量环境→闭包/上一个作用域」的顺序来查找变量,而词法环境所存储的值被要求只有在声明语句之后才能调用。所以会存在暂时性死区,但变量又确确实实被执行上下文提前记住了,所以可以把暂时性死区理解为「变量暂时不能使用的阶段」。所以得出结论①

标签:初始化,执行,变量,let,有无,上下文,声明
来源: https://blog.csdn.net/qq_58875046/article/details/123067627

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有