JS 初了解:从“网页玩具”到企业级语言的进化

很多人对 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) ​ 横空出世。它不是简单的补丁,而是一次彻底的升级,引入了 letconst、箭头函数、类(Class)等现代语言特性,让 JS 终于成为了一门正经的编程语言。


三、变量声明:告别 var,拥抱 letconst

在早期 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 中有三种主要的作用域:

  1. 全局作用域:在最外层声明的变量,哪里都能用(尽量少用,容易冲突)。
  2. 函数作用域:在函数内部声明的变量,只有函数内部能用。
  3. 块级作用域(ES6 新增) :用 {}包裹起来的区域(比如 iffor循环)。

查找规则:"冒泡查找"

当你使用一个变量时,JS 引擎会这样找:

  1. 先在当前作用域找。
  2. 找不到?去外层作用域找。
  3. 再找不到?再去更外层找。
  4. 直到全局作用域,如果还没找到,就报错:ReferenceError: XXX is not defined

为什么 let/const更安全?

var没有块级作用域,会导致变量"泄漏"到外面,引发难以排查的 Bug。而 letconst被限制在 {}内部。

javascript 复制代码
if (true) {
    var a = 10;   // var 没有块级作用域
    let b = 20;   // let 有块级作用域
}

console.log(a); // 10 (泄漏了)
console.log(b); // ❌ 报错:b is not defined

五、内存与生命周期:用完就扔

从内存角度看,代码执行是这样的:

  1. 声明变量:在内存中申请一块区域存放数据。
  2. 执行代码:使用这块数据。
  3. 垃圾回收:当函数执行完毕或代码块结束,JS 的垃圾回收机制会自动销毁这些不再使用的变量,释放内存。

这也是为什么在函数内部定义的变量,在外面访问不到的原因------房子拆了,里面的东西也没了


六、常见报错速查

错误信息 含义 解决办法
Assignment to constant variable 试图修改 const常量 改用 let,或者不要改它
XXX is not defined 变量未定义 检查拼写,或确认是否声明了
Cannot access 'x' before initialization 在声明前访问了 let/const 把代码移到声明之后

总结

JavaScript 虽然起步匆忙,但凭借 ES6 的现代化改造,已经成为前端乃至全栈开发的核心。记住最核心的一点:忘掉 var,用 letconst来管理你的变量,并时刻留意它们所在的"作用域房间"。

这篇总结你还满意吗?如果需要,我也可以帮你把它改写成更适合面试背诵 的精简版,或者针对作用域链画一张图解。

相关推荐
JieE2124 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
冬奇Lab6 小时前
AI Workflow 定义的四次演进:从 Markdown 到 JS 脚本,再到分布式多 Agent
javascript·人工智能·agent
一颗烂土豆12 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
kyriewen14 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
weedsfly17 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
假如让我当三天老蒯17 小时前
前端跨域解决方案(学习用)
前端·javascript·面试
铁皮饭盒19 小时前
Bun 哪比 Node.js 快?
javascript·后端
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
candyTong1 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
_柳青杨1 天前
深入理解 JavaScript 事件循环
前端·javascript