共计 866 个字符,预计需要花费 3 分钟才能阅读完成。
在代码中,声明变量是基础,但是在 javascript 中,经历了从 var 到 let,const 的变化,到底有什么本质上的区别呢?
本文的原文在我的博客中:https://github.com/RachelRen/blog/issues/25
欢迎 star
var 声明的提升
- var 不管在哪里声明的,都会被当成在当前作用域顶部声明的。
- 变量提升是在预编译的过程中发生的,赋值为 undefined
- 被声明的变量还是在原来的地方,真正被赋值
块级声明
块级声明用于声明在指定块的作用域之外无法访问的变量。
- 在同一作用域内,相同的标识符只能有一个
- 当执行流离开这个块级,那么这些变量会被销毁
- 块级作用域中的变量会屏蔽全局作用域中的相同标识符的变量(即取的是块级作用域中的值)
- const 不能再赋值,但是可以修改 对象 的属性值
- 不会变量提升
临时死区
let 和 const 是不会变量提升的,所以在声明变量之前,是用 typeof
是会报错的。
临时死区(TDZ)用来描述 let/const 不提升的效果
Javascript 引擎在扫描代码发现变量声明时,要么将他们提升到作用域顶部(var 声明),要么将声明放到 TDZ(临时死区)中,访问 TDZ 中的变量会触发运行时错误。只有执行变量声明语句后,变量才会从 TDZ 中移出,然后才可以正常访问。
let 声明在循环内部的行为是标准中专门定义的,它不一定与 let 的不提升特性相关。
在循坏中的应用
在 for-in 和 for-of 循环中,let 和 const 会每次迭代时创建新绑定,所以在循环体内,每次都访问到响应的迭代值。但在 for-lenght 中,const 会报错。
在全局作用域中的区别
var 在全局作用域中,会创建一个新的全局变量作为全局对象。
let/const 会在全局作用域下创建一个新的绑定,但是这个绑定不会添加为全局对象的属性(let/const 不能覆盖全局,只能屏蔽它)
用 var 来定义全局变量,可以用在浏览器的跨 frame 或跨 window 访问代码。
最佳实践
默认使用 const,只在确定需要改变值的时候用 let。为了实现代码的不可变,防止某些错误的产生。
正文完
发表至: javascript
2019-05-13