企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### - var、let、const的区别是什么?什么是变量提升?暂时性死区又是什么? #### 三者区别 ~~~ 1 - var【声明变量】 var 没有块的概念,可以跨块访问,无法跨函数访问 2 - let【声明块中的变量】 let 只能在块作用域里访问,不能跨块访问,更不能跨函数访问 3 - const【声明常量,一旦赋值便不可修改】 const 只能在块级作用域里访问,而且不能修改值 Tips: 这里的不能修改,并不是变量的值不能改动,而是变量所指向的那个内存地址保存的指针不能改动 ~~~ **❗ 小知识:** ~~~ var a = 1 let b = 1 const c = 1 console.log(window.a) // 1 console.log(window.b) // undefined console.log(window.c) // undefined 在全局作用域下使用let和const声明变量,变量并不会被挂载到window上,这一点与var不同 关于const,还有两个注意点: - const声明之后必须马上赋值,否则报错 - const简单类型一旦声明就不能修改,而复杂类型(数组,对象)指针指向的地址不能修改,但内部数据可以修改 ~~~ #### 何为提升? ~~~ console.log(a) // undefined var a = 1 ~~~ 上面两行代码,虽然在打印a前变量并没有被声明,但是却可以使用这个未声明的变量,不报错,这一种情况就叫做**提升**,而且提升的是**声明** 实际上,提升不仅仅只能作用于变量的声明,**函数的声明**也会被提升 ~~~ console.log(a) // f a(){} function a(){} var a = 1 ~~~ **函数的声明优先级高于变量的声明** #### 何为暂时性死区? ~~~ console.log(a) // ReferenceError: Cannot access 'a' before initialization let a ~~~ 为何这次就会报错呢? **只要一进入当前作用域,所要使用得变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量,这就是暂时性死区** ~~~ var a = 123; // 声明 if (true) { a = 'A'; // 报错 因为本块级作用域有a声明变量 let a; // 绑定if这个块级的作用域 不能出现a变量 } ~~~ 对于**暂时性死区**,我的理解是声明提升了,但初始化没有被提升,而提升是声明提升,并初始化为undefined #### 总结 **函数提升优于变量提升,函数提升会把整个函数提升到作用域顶部,变量提升只会把声明提升到作用域顶部** * var存在提升,我们能在声明之前使用。let和const由于暂时性死区的原因,不能在声明前使用 * var 在全局作用域下声明变量会导致变量被挂载到window上,其他两者不会 * let / const 作用基本一致,但后者不允许再次赋值 * let、const不允许在相同作用域内,重复声明同一个变量