发现一些老代码都是用var声明变量的,现在却几乎不用var关键字了?

为什么我们逐渐抛弃了 var

之前在看一些老代码的时候发现,通篇都是用var来声明变量的。 众所周知,现在几乎没人使用var声明变量了。

因为var声明存在很多问题。最经典的当然属于下面这个案例

js 复制代码
for (var i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i);
  }, 100);
}
// 输出:3, 3, 3

可以看到在循环中通过var来声明变量会导致共用一个变量i,最终输出结果都只和i的最终结果有关。

弱类型语言?

别的语言都例如JAVA都是用int 、string 这类关键字来声明变量的,怎么JS这么随意?其实 JS 的这种"随意"写法背后,是它语言设计初期的特点导致的。

这就不得不提到JS的发展史了,查了一下资料,发现JS最初是在10 天内 被设计出来的。非常amazing啊所以他的健壮性肯定不能和其他高级语言相比。

不过在漫长的发展中,js也在查缺补漏,尤其是2015年的es6补丁问世,使得JS的健壮性有了质的飞跃。

本期主题讨论的let和const就是这次补丁的内容之一。

let与const解决了什么问题?

找了一下相对官方的说明

这是原文,翻译一下什么意思呢,就是说let和const声明变量的时候,有以下几个特性:

  1. 他们声明的都是块级作用域变量
  2. letconst 的变量在作用域中虽已被注册,但访问前必须先执行到它们的声明语句,否则会报错。
  3. 如果变量没有初始化值(如 let a;),那么在词法绑定被求值时,这个变量的值是 undefined

听着实在太迷糊了,这到底想表达什么?看我两行代码给你说清楚,

js 复制代码
{
  console.log(a); // ❌ ReferenceError: Cannot access 'a' before initialization
  let a = 10;
}

怎么样是不是醍醐灌顶?也就是let这种声明方式和var不一样,存在暂时性死区,而var不存在,如果同样执行就会出现下面的情况:

js 复制代码
{
console.log(a);//输出undefiend
var a = 10;
}

需要注意的是,一堆{}表示一个块级作用域,而var不受块级作用域影响,因此在es6之前,你可以理解为定义变量大部分都定义到全局上去了,浏览器环境是window对象,node环境就是global了。

那这就很不舒服啊。我就只想临时拿一个变量用用,结果你告诉我必须得在全局上操作,不仅让人不爽,还容易引发命名冲突和难以维护的代码结构。

js 复制代码
    {let a = 1;
    console.log(a);}// 1
    {let a = 2;
    console.log(a); // 2
    }
    console.log(a);// ❌ ReferenceError

像这样子,每个块级作用域中的 a 都互不干扰,出了作用域变量就销毁,最后一行报错说明外部无法访问它们。非常干净利落。

有小伙伴问为什么你不说说const,那是因为const和let区别不大,只是多加了些规则,不让你随意赋值,且必须给一个初始化值。也就是让你定义常量用的。比如定义对象、定义常数等等

总的来说,letconst 的出现,让 JavaScript 在变量管理上更加严谨,也更接近其他现代语言的规范。它们不仅解决了 var 的历史遗留问题,也让代码更安全、易读、好维护。

所以在日常开发中,尽量别再用 var,是官方更推荐的写法。

相关推荐
计算机魔术师35 分钟前
实测GPT-6 Astra后,我发现过去十年的专业门槛正在失效
前端
虎头金猫38 分钟前
Pic Smaller 本地部署:压缩图片、转换格式,再搭建自己的 Web 工具
运维·前端·开源·aigc·ai编程·ai写作
hunterandroid39 分钟前
Android ANR 排查实战:从线上告警到主线程卡点定位
android·前端
图扑软件1 小时前
下篇・换墨|主题/多语言/移动端,一套组件全覆盖
前端·javascript·ui·性能优化·数据可视化
程序员老赵1 小时前
Docker 部署 TeX Live:轻松搭建 LaTeX 论文排版编译平台
前端·docker·latex
Zhu7581 小时前
部署安全的pg数据库,搭配pgadmin实现web界面管理
前端·数据库·安全
杉氧1 小时前
打破边界(二):在 React Native 中嵌入原生 UI 组件 (Native UI Components)
android·前端·react native
沧沧凉凉1 小时前
两个小时,AI 把我 2018 年那个 Unity 版保卫萝卜搬进了浏览器
前端·游戏·ai编程
薄雾晚晴2 小时前
大模型Skill暴论:所有Skill终将消亡?最新Skill方法论与模型增强开发实战
前端·后端·架构
绝世唐门三哥2 小时前
Git - git stash 语法演进与实战指南
前端·git