很多人对 JavaScript 的第一印象是"乱"、"奇怪",甚至觉得它是个"玩具语言"。其实,JS 的混乱很大程度上是因为它出生得太快,成长得太猛。这篇文章带你快速理清 JavaScript 到底是什么,以及为什么我们要学 ES6。
一、JavaScript 的身世:蹭热度的一周工程
JavaScript 诞生于 1995 年,它的名字其实是一场营销奇迹:
- 蹭 Java 的热度 :当时 Java 正如日中天,网景公司(Netscape)为了让这门新语言火起来,硬是给它起了个名字叫 JavaScript。实际上,除了名字里都有"Java",两者毫无关系。
- 仅用 10 天设计 :早期的 JS 是为了给静态网页加点"特效"(比如图片轮播、弹窗)而设计的。由于时间紧迫,设计上存在很多妥协和瑕疵(比如
==的隐式转换)。 - ECMAScript 标准 :我们现在说的 ES5、ES6,其实是遵循 ECMAScript(简称 ES) 这个标准规范的 JavaScript 实现。
二、为什么突然要学 ES6?
2015 年之前,JS 主要用来做简单的 DOM 操作。但随着 Web 应用越来越复杂(像 Gmail 这样的单页应用出现),老旧的语法(ES5)已经无法满足企业级大型项目的开发需求。
于是,ES6(ECMAScript 2015) 横空出世。它不是简单的补丁,而是一次彻底的升级,引入了 let、const、箭头函数、类(Class)等现代语言特性,让 JS 终于成为了一门正经的编程语言。
三、变量声明:告别 var,拥抱 let和 const
在早期 JS(ES5)中,只有 var用来声明变量。但 var有很多"坑",所以在现代 JS(ES6+)中:
| 关键字 | 含义 | 特点 |
|---|---|---|
**var** |
过时 | 有变量提升、没有块级作用域,容易造成污染,现在基本不用。 |
**let** |
变量 | 可以被重新赋值,有块级作用域,最常用。 |
**const** |
常量 | Constant ,声明时必须赋值,且不能被重新赋值。 |
举个栗子 🌰
ini
// 错误示范(不要用)
var name = "Old JS";
// 现代写法
let age = 25; // 年龄会变,用 let
age = 26; // ✅ OK
const PI = 3.14; // 圆周率不变,用 const
PI = 3.15; // ❌ 报错:Assignment to constant variable
最佳实践 :默认使用
const,只有当确定这个值需要改变时,才使用let。
四、作用域:变量住在哪个"房间"?
作用域(Scope) 决定了变量在哪里可以被访问。JS 中有三种主要的作用域:
- 全局作用域:在最外层声明的变量,哪里都能用(尽量少用,容易冲突)。
- 函数作用域:在函数内部声明的变量,只有函数内部能用。
- 块级作用域(ES6 新增) :用
{}包裹起来的区域(比如if、for循环)。
查找规则:"冒泡查找"
当你使用一个变量时,JS 引擎会这样找:
- 先在当前作用域找。
- 找不到?去外层作用域找。
- 再找不到?再去更外层找。
- 直到全局作用域,如果还没找到,就报错:
ReferenceError: XXX is not defined。
为什么 let/const更安全?
var没有块级作用域,会导致变量"泄漏"到外面,引发难以排查的 Bug。而 let和 const被限制在 {}内部。
javascript
if (true) {
var a = 10; // var 没有块级作用域
let b = 20; // let 有块级作用域
}
console.log(a); // 10 (泄漏了)
console.log(b); // ❌ 报错:b is not defined
五、内存与生命周期:用完就扔
从内存角度看,代码执行是这样的:
- 声明变量:在内存中申请一块区域存放数据。
- 执行代码:使用这块数据。
- 垃圾回收:当函数执行完毕或代码块结束,JS 的垃圾回收机制会自动销毁这些不再使用的变量,释放内存。
这也是为什么在函数内部定义的变量,在外面访问不到的原因------房子拆了,里面的东西也没了。
六、常见报错速查
| 错误信息 | 含义 | 解决办法 |
|---|---|---|
Assignment to constant variable |
试图修改 const常量 |
改用 let,或者不要改它 |
XXX is not defined |
变量未定义 | 检查拼写,或确认是否声明了 |
Cannot access 'x' before initialization |
在声明前访问了 let/const |
把代码移到声明之后 |
总结
JavaScript 虽然起步匆忙,但凭借 ES6 的现代化改造,已经成为前端乃至全栈开发的核心。记住最核心的一点:忘掉 var,用 let和 const来管理你的变量,并时刻留意它们所在的"作用域房间"。
这篇总结你还满意吗?如果需要,我也可以帮你把它改写成更适合面试背诵 的精简版,或者针对作用域链画一张图解。