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

上一篇:丢失的第一个正整数


下一篇:【近日力扣】单词拆分+合并区间+链表排序+调整数组顺序使奇数位于偶数前面