写JavaScript时,你用什么声明变量?这个选择背后藏着一门语言的设计演变。
JavaScript有三种变量声明方式。var是最老的写法,它的作用域绑定在函数上,而非代码块。这意味着花括号挡不住它——循环里声明的var,外面照样能访问。它允许重复声明,也允许后期修改,这种宽松带来了隐患:同名变量可能意外覆盖,变量提升(hoisting)让它在正式声明前就已存在,只是值为空。
![]()
let和const是ES6引入的现代方案,都把作用域收紧到块级。let允许重新赋值,但禁止在同一作用域重复声明;const更严格,声明时必须初始化,且全程锁定引用。对原始类型(数字、字符串等),这等于完全不可变;对对象和数组,const锁的是指针,内容仍可修改。
变量提升的行为也有差异。var在代码执行前就被创建,只是未赋值;let和const虽然也被"知道"存在,但在声明前访问会触发暂时性死区(Temporal Dead Zone),直接报错而非静默返回undefined。这种设计掐掉了大量隐蔽bug。
JavaScript还有两种运行模式。默认的"松散模式"(Sloppy Mode)容忍不安全操作——给未声明变量赋值会自动创建全局变量,静默失败也不报错。"严格模式"(Strict Mode)需要手动开启('use strict'),它会拦截这些行为,强制变量先声明后使用,让错误暴露得更早。
现在的项目里,var几乎绝迹。let处理需要变化的值,const作为默认选择——这种组合既保留了灵活性,又通过块级作用域和不可重复声明的机制,把意外改写的可能性压到最低。语言的设计者在宽松与安全之间,最终倒向了后者。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.