var、let和const区别

var、let和const区别

变量提升问题

  • var声明的变量存在变量提升,而let与const声明的变量不存在变量提升,但存在暂时性死区

  • 即在预编译阶段,js引擎扫描代码时,遇到变量声明,会把var声明提到作用域的顶端,而 let和const声明,则会被放在暂时性死区中。访问暂时性死区中的变量,会触发运行时错误,只有执行变量声明语句后,变量才会从暂时性死区中移除,才可正常访问

重复定义问题

  • var声明的变量可以重复定义

  • let与 const声明的变量,在同一作用域下不可重复声明,否则报错

全局变量问题

  • var声明的变量可能会覆盖全局变量

  • 而let与 const声明的变量只可能会遮住全局变量,不会覆盖全局变量,也就是不会破坏全局作用域

作用域的问题

  • 在ES6之前,只存在全局作用域、 函数作用域,使用 var声明变量,可能会出现内部变量覆盖外部变量的情况,并且循环变量会泄漏为全局变量,还有在ES5中规定,函数声明只能在全局作用域或者函数作用域中进行,但浏览器为了兼容旧代码,不会报错

  • 在ES6中,除了全局作用域、函数作用域,引入了 块级作用域的概念,如我们常见的 {}、if{}、for(){} 都会形成块级作用域

  • 在严格模式下,函数声明语句的行为类似于let,在块级作用域之外不可引用,并且会被提升至块级作用域的顶部,如果是let定义的函数表达式,不会被提示

  • 在非严格模式下,为了兼容旧代码,最终的函数声明语句的行为类似 var, 声明会被提升到外围函数或全局作用域的顶部,而不是代码块的顶部

  • 在使用 let、 const声明变量时,循环变量不会泄漏成为全局变量,在for循环中,设置循环变量与循环体内部是两个单独的作用域,还可以在块级作用域中进行函数声明,需要注意的是,块级作用域必须存在

let与 const的主要区别

  • const声明的是常量,在声明后,常量指向的内存地址中保存的数据不可改动
  • 对于简单类型的数据,如数值、字符串等,声明后不可在修改
  • 对于引用类型的数据,只要保持指针不变即可
posted @   伏月廿柒  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示