深入理解let、const和var

深入理解let、const和var

共同之处

在ES6以前,使用的是var​进行变量声明,在此之后,变量申明的方式多了let​和const。

不同之处
  • 作用域 :var在当前函数作用域中有效,let和const在块级作用域中有效。
  • 变量提升 :var会变量提升并且可以访问,值为undefined,let和const有变量提升但是无法访问。
  • 重复声明 :var可以重复声明,let和const无法重复声明。
  • 声明初始化 :var和let可以不用初始化,const必须要初始化。
  • 值的可变性 :var和let声明的变量可以修改,const声明的变量不能修改本身的值,可以修改对象的属性和方法。
  • 挂载到window对象 :var声明的变量会挂载,let和const不会。
作用域不同

​var​声明的变量存在执行上下文的变量环境 中,该环境在整个函数作用域中都是能够访问的。

​let​和const​声明的变量存在执行上下文的词法环境 中,该环境在当前的块级作用域中才能被访问。

js 复制代码
{
  var a = 1;
  let b = 2;
  const c = 3;
  console.log(c); // 3
}
console.log(a); // 1
console.log(b); // ❌ 引用错误
console.log(c); // ❌ 引用错误
变量提升与暂时性死区

​var​声明的变量在引用之后,是能够访问到变量的,只是这时候的变量获取到的是undefined​,这样的情况就是变量提升。

​let​和const​声明的变量在引用之后,是会报错的。虽然 let​ 和const​也被提升,但在声明之前访问会报错,这段不可访问的时间叫 暂时性死区。

js 复制代码
console.log(a); // undefined(提升)
console.log(b); // 无法访问,暂时性死区
console.log(c); // 无法访问,暂时性死区
var a = 1;
let b = 2;
const c = 3;
重复声明

​var可以重复进行声明,不会有问题;

​let​和const在一个块级作用域下,只能进行一次声明。

js 复制代码
var x = 10;
var x = 20; // ✅ 

let y = 10;
let y = 20; // ❌

const z = 30;
const z = 40; // ❌
声明初始化

​var​和let​在声明时可以不赋值,自动赋值为null;

​const在声明时必须进行赋值,否则会报错。

js 复制代码
var a;  // 相当于 var a = null;
let b;  // 相当于 let b = null;
const c; // ❌ 报错。
值的可变性

​var​和let​声明的变量值是可以重新赋值的,值是可变的;

​const​声明的变量值是不可以修改 的,如果赋值的是对象,对象内的属性和值是可以改变的。类似于常量。

js 复制代码
var b = 1;
b = 2; // ✅ 可重新赋值

let a = 1;
a = 2; // ✅ 可重新赋值

const obj = { name: 'ErMao' };
obj.name = 'Da'; // ✅ 可修改对象内容
obj = {};        // ❌ 不可重新赋值
挂载在window对象上

​var在全局作用域下声明的变量会挂在window对象上;

​let​和const声明的变量不会挂在window对象上;

js 复制代码
var a = 1;
let b = 2;
const c = 3;
console.log(window.a) // 1
console.log(window.b) // undefined
console.log(window.c) // undefined
总结

在ES6​以前,声明变量的时候会使用var​,会出现一些问题包括变量提升 、无法形成词法作用域 以及随意修改和声明 。出现let​和const​后,让JS的代码更加安全、更加简洁和更加规范。

常见的差别有:作用域、变量提升、重复声明、声明初始化、值的可变性、是否会挂载在window对象上。

在理解这一块知识前,最好先理解JS中的执行上下文 以及作用域 的相关知识,了解词法环境 和变量环境在执行上下文中的作用。

‍

相关推荐
古茗前端团队4 小时前
由 key 引发的思考
前端·javascript·react.js
kyriewen5 小时前
我扫了 422 个仓库,近一半 CI 在裸装依赖
前端·javascript·程序员
鹏多多5 小时前
AI 到底能不能独立做个产品?我拿一个小程序验证了
前端·微信小程序·ai编程
火山引擎开发者社区5 小时前
构建专属的飞书群开发助手,AgentKit Studio 一键部署 DeepSeek Harness Super-Agent
前端
啾咪orJIUMI7 小时前
Vue 3 + 高德地图封装实战:点位、区域、Loca 流光与 Vue 信息窗体
前端·vue.js
掘金者阿豪7 小时前
AI数据库不只是向量检索:从数据语义到库内智能计算的技术演进
前端
梦里寻码7 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing037 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
SameX7 小时前
HarmonyOS ArkUI Dialog 复用 用 @CustomDialog + enum type 做多类型统一管理的做法
前端
AiMan8 小时前
豆包爱学还是不可以导出左侧所有对话,只能单容导出,方法不对吗
前端