JS到底在解决什么问题
很多人学 JS 的第一印象是“给网页加特效”。这只说对了一小部分。JS 的本质是一门运行在宿主环境里的脚本语言,浏览器提供 DOM、BOM 等接口,Node.js 提供文件、网络等能力。语言本身负责逻辑,宿主决定它能碰到什么。
理解这一点,就不会把“操作 DOM”当成 JS 的全部。换到 Node 环境,同样的语法照样能写服务端逻辑。
先搞懂执行机制,再谈框架
JS 是单线程的,靠事件循环调度任务。同步代码先执行,异步回调进入队列,等调用栈清空后再依次处理。宏任务与微任务的顺序差异,是很多“输出顺序题”的根源。
建议初学者手动画一遍调用栈和任务队列的流转,比死记结论有用得多。框架再花哨,底层仍是这套调度模型。
作用域与闭包:绕不开的基本功
var 有函数作用域和变量提升,let / const 是块级作用域且有暂时性死区。闭包则是函数记住并访问其词法作用域的能力,常用于封装私有状态和函数工厂。
一个常见误区是把闭包等同于“内存泄漏”。闭包本身没问题,问题是长生命周期的引用持有大对象却不再释放。
this 的指向规则
普通函数调用看调用方式,箭头函数继承外层 this。优先级大致是:new > 显式绑定 > 隐式绑定 > 默认绑定。记住这条链,大多数 this 题都能推出来。
异步编程的演进路线
从回调到 Promise 再到 async/await,核心变化是错误处理和流程表达更接近同步写法。Promise 解决了回调地狱的嵌套问题,async/await 则让 try/catch 重新可用。
实践建议:并发请求用 Promise.all,需要容错用 Promise.allSettled,别在循环里无脑 await 串行执行。
几个高频陷阱
==的隐式转换规则复杂,日常统一用===。- 数组和对象的浅拷贝与深拷贝要分清,
slice、扩展运算符都是浅的。 NaN !== NaN,判断用Number.isNaN。- 浮点数精度问题源于二进制表示,金额计算建议转整数或使用专用库。
学习路径建议
先掌握语法、作用域、原型链和异步模型,再动手做小项目巩固。之后按兴趣深入 DOM 操作、模块化或 Node 服务端。框架可以学,但别跳过语言基础——底层扎实,换框架的成本才低。
JS 的生态变化快,但语言核心相对稳定。把执行机制和异步模型吃透,比追新 API 更有长期价值。