为何大量JavaScript示例仍使用var而非const、let?如今开发该用var吗?
为什么各类JS示例里还在大量用
var,不换成let/const 这类情况真不是开发者偷懒,背后有非常实际的考虑:
- 零兼容风险的选择
var是从JS诞生第一天就存在的语法,从IE5.5到最新版的Node、浏览器,没有任何一个环境会因为碰到var报语法错。反观let/const是ES6标准才正式加入的特性,要是把示例里的var全换成let/const,碰到要求兼容IE11、老旧嵌入式Webview、上古Node版本的读者,一打开示例就直接语法报错,第一反应是库坏了,根本不会想到是自己环境太老。对开源项目来说,示例的最低运行门槛越低,用户的入门摩擦就越小,这是非常实在的设计选择。 - 对新手更友好的历史惯性
很多JS教程、示例的目标读者是完全零经验的入门者。var的相关特性、踩过的坑,是过去二十多年JS教材里反复讲烂的内容,哪怕写出来有不符合现代规范的地方,新手碰到问题一搜就能找到几十篇踩坑记录。如果换成let/const,要是碰到暂时性死区、块级作用域这类新手很难理解的特性,踩了坑连排查方向都找不到,反而提高了示例的理解门槛。 - 没有收益的重构不值得做
大部分开源项目的文档是攒了好几年甚至十几年的积累,把所有散落的示例里的var挨个替换成let/const,本质是完全没有功能收益的工作量:代码运行逻辑没有任何变化,还要承担修改过程中不小心改坏示例、引入错误的风险。像cubejs、Vue这类项目的很多示例片段,是项目刚发布第一版的时候就贴在文档里的,只要能正常跑,没人会特意花时间去改这部分不影响功能的细节。
现在写实际业务代码,还有必要用
var吗? 直接给明确结论:
除非你有硬性要求必须兼容ES6发布之前的上古JS环境,否则完全没有在新代码里用
var的理由。
- 写代码的默认优先级是
const优先:只要一个变量初始化之后不会被重新赋值,就用const声明——比如你提到的示例里的cubejsApi实例,初始化完之后基本不会被重新赋值,用const才是最合理的写法,还能帮你挡住很多意外重赋值的低级bug。 - 确实需要重新赋值的变量,再用
let声明:它是块级作用域,不会像var那样把变量意外泄露到外层作用域,也不存在经典的“for循环里用var捕获循环变量,最后拿到的全是循环结束值”的闭包坑,心智负担比var小很多。 - 真的需要用
var的场景非常少:只有当你的代码必须跑在完全不支持ES6的环境(比如IE8及以下、老到离谱的工业嵌入式设备的Webview),而且已经验证过let/const在目标环境完全不可用的时候,再退回用var写。
别被文档里的示例写法带偏——文档选var是为了最大范围的兼容性,不代表这是生产环境的最佳写法,你自己写业务代码完全可以按照现代JS规范选const和let,主动选var纯属给自己加不必要的线上bug排查负担。
内容的提问来源于stack exchange,提问作者radiorz
相关产品推荐
相关产品推荐

