写点什么

一个非常常见的问题:var、let 和 const

作者:肥晨
  • 2022-11-01
    江苏
  • 本文字数:692 字

    阅读完需:约 2 分钟

在 ECMAScript 中,有 3 个关键字可以用于声明变量。分别是:var、let 和 const。其中,var 在所有 ECMAScript 都是可以使用的,但是 let 和 const 需要在 ECMAScript6 及其以上版本才可以使用。

let 和 const 的行为基本一致,但是其中有一个比较重要的一个区别,就是 const 用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行错误。所以常有人直接理解为 const 用于声明常量。

一:作用域

var 是函数作用域。

let 和 const 是块级作用域。

也就是说 var 声明的变量出函数时就会被销毁,而 let 和 const 声明的变量出块级内部就会被销毁。

下面使用 for 举例:

for 中的变量声明,也是 var 和 let 的区别之一。



 造成这种现象的原因就是:var 可以渗透到循环体外部,在退出循环的时候,迭代变量保存的是导致循环退出的值。而 let 的是因为作用域反限于 for 循环块的内部,迭代循环声明一个新的变量,每个 setTimeout 引用的都是不同的变量实例。

二:优先级

三个关键字之间没有优先级,按照声明顺序。

三:全局声明区别

let 和 var 的不同是,let 不会成为 window 对象的属性。



 四:变量提升

这也就是 let 和 var 的一个重要的区别,就是 let 声明的变量不会在作用域中被提升。



 在代码解析时,JavaScript 引擎也会注意到后面的 let(也就是常谈到的“类似提升行为”),只不过在此之前不能操作这个被声明的变量,不然就会送给你漂亮的红色 ReferenceError。而这个瞬间也被称之为“暂时性死区”。也算是在某些方面限制了代码的规范度吧。

其他:

1.在 ES6 中明确规定,在{}中出现 let 和 const,就会被限制在里面(也就是块级作用域)。

2.函数提升优先级大于 var 的变量提升(还是不要重名比较好,你想想要是你们部门有人和你重名重姓会多麻烦)。

发布于: 刚刚阅读数: 4
用户头像

肥晨

关注

还未添加个人签名 2021-04-15 加入

平台:InfoQ、阿里云、腾讯云、CSDN、掘金、博客园等平台创作者 领域:前端 公众号:农民工前端

评论

发布
暂无评论
一个非常常见的问题:var、let和const_11月月更_肥晨_InfoQ写作社区