小程序里为何偏爱 var?从一段代码看 var、let 和 const 的较量!

🚀 小程序里为何偏爱 var?从一段代码看 varletconst 的较量!

作者:辞无所假
日期:2025年3月13日
标签:JavaScript | 微信小程序 | 变量作用域


大家好!👋 最近在研究微信小程序代码时,我发现了一段让人“脑洞大开”的代码片段。里面用的是老朋友 var,而不是现代化的 letconst。这让我不禁思考:为啥不用更“潮流”的关键字呢?今天就带大家一起剖析这段代码,聊聊背后的门道,顺便用 Mermaid 画个流程图,直观感受一下!✨

🎯 问题起源:代码长啥样?

先上代码,这是我在小程序 PageonLoad 生命周期里挖到的“宝藏”:

if (options.fromTab === 'saved') {
  var fixedFromTab = 'toCompare';
} else {
  var fixedFromTab = options.fromTab;
}
// 后面用它更新数据
this.setData({
  fromTab: fixedFromTab
});

这段代码的任务很简单:根据 options.fromTab 的值,决定 fixedFromTab'toCompare' 还是原值,然后塞进 this.setData 更新页面数据。乍一看挺普通,但为啥用 var?换成 letconst 会咋样?别急,咱们慢慢拆解!🔍

🧠 分析:var 的“秘密武器”

1. 作用域是关键!

在 JavaScript 中,varletconst 的最大区别就是作用域:

  • var:函数作用域,声明的变量在整个函数里都能用,哪怕是在 if 块里定义的。
  • letconst:块作用域,只在 {} 块内有效,出了块就“拜拜”。

在这段代码中,fixedFromTab 定义在 ifelse 块里,但后续的 this.setData 需要用到它。如果用 let,会发生什么?来看看:

if (options.fromTab === 'saved') {
  let fixedFromTab = 'toCompare';
} else {
  let fixedFromTab = options.fromTab;
}
this.setData({
  fromTab: fixedFromTab // ❌ 报错:fixedFromTab 未定义
});

由于 let 的块作用域,fixedFromTab 在块外压根儿找不到,程序直接抛 ReferenceError。而 var 因为是函数作用域,整个 onLoad 函数都能访问它,完美解决问题!🎉

2. const 为啥不香?

有人可能会问:“那用 const 不行吗?”答案是不行!const 是常量,一旦赋值就不能改。但在这段代码里,fixedFromTab 的值在 ifelse 里可能是不同的。如果用 const,第二次赋值会报错:

if (options.fromTab === 'saved') {
  const fixedFromTab = 'toCompare';
} else {
  const fixedFromTab = options.fromTab; // ❌ 语法错误:重复声明
}

所以,const 在这里完全“躺平”,没法用。😂

3. 变量提升的“彩蛋”

var 还有个特性:变量提升(hoisting)。声明会被“偷偷”提到函数顶部,虽然初始化不会提升。比如:

console.log(fixedFromTab); // undefined
var fixedFromTab = 'hello';

在这段代码中,提升影响不大,但它确实是 var 的“隐藏技能”,让它在函数里随处可用。

📈 流程图:直观看作用域区别

用 Mermaid 画个流程图,感受一下 varlet 的区别:

在这里插入图片描述

从图中 видно(看得见):var 一路畅通,let 在块外就“翻车”了。🚗💥

🤔 为啥开发者选 var

  1. 简单粗暴:直接在块内用 var,省去提前声明的麻烦,代码更简洁。
  2. 历史遗留:小程序早期,开发者可能更习惯 var,毕竟 letconst 是 ES6 的“新宠”。
  3. 无副作用:在这段代码里,fixedFromTab 只用了一次,var 的函数作用域不会惹麻烦。

🌟 改进:现代化的 let 方案

虽然 var 能用,但现代 JavaScript 更推崇 letconst,因为它们作用域更清晰,减少意外bug。怎么改呢?很简单,在块外声明 let

let fixedFromTab; // 提前声明
if (options.fromTab === 'saved') {
  fixedFromTab = 'toCompare';
} else {
  fixedFromTab = options.fromTab;
}
this.setData({
  fromTab: fixedFromTab
});

这样既保留了功能,又符合最佳实践,代码更“优雅”!💅

🎬 总结:var 不死,只是“低调”了

通过这段小程序代码,我们发现 var 的函数作用域确实有它的用武之地,尤其在需要跨块访问变量时。但随着 letconst 的普及,现代开发更倾向于块作用域的精确控制。开发者用 var,可能是习惯、简便或场景使然,但换成 let 往往是更好的选择。

你遇到过类似的代码吗?欢迎在评论区分享你的看法!如果觉得这篇博客有收获,别忘了点赞 + 关注哦!😎 下期见!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值