本文学习目标
-
理解 JavaScript 在浏览器与 Node.js 中的运行环境。
-
掌握语法、类型、作用域、闭包与原型链。
-
熟练使用异步编程(Promises、async/await)并理解事件循环。
-
会操作 DOM、处理事件、发起网络请求(fetch)。
-
了解模块化、打包、测试、性能与安全要点。
目录(建议阅读顺序)
-
JavaScript 简介与运行环境
-
快速上手:第一个脚本 + 调试工具
-
基本语法与数据类型
-
变量声明:var / let / const
-
运算符、流程控制
-
函数(声明、表达式、箭头函数、参数特性)
-
作用域、闭包与提升(hoisting)
-
对象与数组进阶(解构、展开、Map/Set)
-
原型与继承 / class
-
异步编程:回调、Promise、async/await
-
事件循环、微任务与宏任务
-
浏览器 API:DOM、事件、表单、存储(localStorage)
-
网络请求:fetch API 与错误处理
-
模块化(ESM)与代码分割
-
工程化:打包、转译、Lint、测试、CI
-
性能优化与浏览器渲染原理简介
-
安全(XSS/CSP/CORS)与最佳实践
-
常见面试题与实战项目建议
-
学习路线与资源推荐
1. JavaScript 是什么?运行在哪里?
-
JavaScript 是一门动态、解释型语言,最初用于浏览器端实现网页交互。
-
运行环境:
-
浏览器(Chrome、Firefox、Safari 等):提供 DOM、BOM、Fetch、Storage 等 Web API。
-
Node.js:服务器端运行环境,提供文件系统、网络等 API。
-
理解差别:语言本身(语法、类型系统、事件循环)在各处相同,但可访问的全局对象与 API 不同。
2. 快速上手:第一个脚本与调试
HTML 中引入 JS:
<script>
console.log('Hello, JavaScript!');
</script>
或外部文件:
<script src="app.js" defer></script>
-
defer:延迟执行,保证在 DOM 解析后执行且保持脚本顺序。 -
async:异步加载,执行不保证顺序。
调试工具:浏览器 DevTools(Console、Sources、***work、Performance、Memory)。学会在 Sources 里下断点、查看 Call Stack、观察 Scope 与变量。
3. 基本语法与数据类型
原始类型(primitive):undefined, null, boolean, number, bigint, string, symbol。
引用类型(object):对象、数组、函数、日期等。
typeof 1 // 'number'
typeof null // 'object'(历史遗留)
注意:NaN 仍然是 number,Number.isNaN() 更可靠。
字符串模板:
const name = '张三';
console.log(`你好,${name}`);
4. 变量声明:var / let / const
-
var:函数作用域,会发生提升(hoisting),可能产生意外行为。 -
let:块级作用域,推荐用于可变变量。 -
const:块级作用域,声明常量(绑定不可变,但对象内部可变)。
if (true) {
let a = 1;
const b = 2;
}
// a 和 b 在这里不可访问
尽量默认用 const,需要重新赋值时使用 let。避免 var。
5. 运算符与控制流
-
基本运算:
+ - * / %,字符串拼接+。 -
严格等于
===vs 宽松等于==(避免使用==,会做类型转换)。 -
三元运算:
condition ? expr1 : expr2。 -
流程控制:
if/else,switch,for,while,for...of,for...in(遍历属性,谨慎使用)。
示例:
for (const item of [1,2,3]) console.log(item);
6. 函数:声明、表达式与箭头函数
函数声明(可提升):
function add(a, b) { return a + b; }
函数表达式:
const add = function(a, b) { return a + b; };
箭头函数(无 this 绑定,适合回调与短函数):
const square = x => x * x;
参数特性:默认值、剩余参数(rest)、扩展运算符(spread)
function sum(a = 0, ...nums) {
return nums.reduce((s, n) => s + n, a);
}
高阶函数:函数可以作为参数或返回值(如 map, filter, reduce)。
7. 作用域、闭包与提升(hoisting)
作用域链(Scope Chain):函数内部访问外层变量的机制。闭包(closure)是函数保留对定义时作用域的引用。
示例(闭包常见用法):
function makeCounter() {
let count = 0;
return function() { return ++count; };
}
const c = makeCounter();
console.log(c()); // 1
console.log(c()); // 2
提升(hoisting):变量与函数的声明在编译阶段被提升,但 let/const 有 “暂时性死区”(TDZ)。
8. 对象与数组进阶
对象字面量、属性访问、方法:
const person = { name: '张三', age: 22, greet() { console.log('hi'); } };
person.height = 180;
解构赋值:
const { name, age } = person;
const [a, b] = [1, 2];
展开运算符(Spread):
const arr2 = [...arr, 4, 5];
const person2 = { ...person, job: 'dev' };
Map/Set:提供更灵活的键与集合语义。
9. 原型、原型链与 class
JS 使用原型(prototype)实现继承:对象会沿着 [[Prototype]](__proto__)链查找属性。
构造函数与类:
function Person(name) { this.name = name; }
Person.prototype.greet = function() { console.log(this.name); };
// ES6 class
class Person2 {
constructor(name) { this.name = name; }
greet() { console.log(this.name); }
}
class 只是语法糖,底层仍基于原型。
10. 异步编程:回调 -> Promise -> async/await
回调地狱示例(不推荐)
doA(function(a) {
doB(a, function(b) {
doC(b, function(c) {
// ...
});
});
});
Promise 基本用法
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
wait(1000).then(() => console.log('1s'));
链式错误处理:
fetch('/api/data')
.then(res => res.json())
.then(data => { /* use data */ })
.catch(err => console.error(err));
async / await(语法糖)
async function load() {
try {
const res = await fetch('/api/data');
const data = await res.json();
return data;
} catch (err) {
console.error(err);
}
}
注意:await 只能在 async 函数中使用。
11. 事件循环(Event Loop)、微任务与宏任务
核心概念:
-
Call Stack(调用栈):同步代码在此执行。
-
任务队列(Task Queue / macrotasks):如
setTimeout回调、I/O 回调等。 -
微任务队列(microtasks):Promise 的回调(
then)、queueMicrotask。
执行顺序:每个宏任务执行结束后,会清空所有微任务队列,再执行下一个宏任务。
示例:
console.log('script start');
setTimeout(() => console.log('setTimeout'), 0);
Promise.resolve().then(() => console.log('promise'));
console.log('script end');
// 输出: script start, script end, promise, setTimeout
理解事件循环对于调试异步问题非常关键。
12. DOM 操作与事件处理
查询元素:document.querySelector, getElementById。
创建/插入节点:
const p = document.createElement('p');
p.textContent = 'hello';
document.body.appendChild(p);
事件绑定:
element.addEventListener('click', handler, { passive: true });
passive 用于滚动等性能优化;capture 控制捕获/冒泡阶段。
事件委托:把事件绑定在父元素,通过 event.target 识别子元素,减少事件处理器数量。
安全注意:避免使用 innerHTML 插入未信任的内容(XSS 风险)。使用 textContent 或受信任的模板渲染。
13. 网络请求:fetch 与错误处理
基本 fetch:
fetch('/api/data')
.then(res => {
if (!res.ok) throw new Error('***work response was not ok');
return res.json();
})
.then(data => console.log(data))
.catch(err => console.error(err));
发送 JSON:
fetch('/api', { method: 'POST', headers: { 'Content-Type':'application/json' }, body: JSON.stringify({ a:1 }) });
超时处理:fetch 本身无超时,需要用 AbortController。
14. 模块化(ES Modules)
ESM:export / import
// math.js
export function add(a,b){return a+b}
// main.js
import { add } from './math.js';
浏览器支持 ESM,Node.js 也支持(需设置 type: module 或使用 .mjs)。模块支持动态 import() 返回 Promise,用于按需加载。
15. 工程化:打包、转译、Lint、测试
-
打包器:Webpack、Vite、Rollup — 用于代码分割、Tree-shaking、资源管理。
-
转译:Babel — 兼容旧浏览器。
-
Lint:ESLint — 保持代码风格与发现潜在错误。
-
格式化:Prettier。
-
测试:Jest(单元测试)、Cypress(端到端测试)。
设置脚手架(如 Vite)可以快速开始现代项目。
16. 性能优化与渲染原理简介
-
重排(reflow)与重绘(repaint)代价大,尽量批量修改 DOM,使用
transform/opacity做动画。 -
减少 DOM 节点数量、使用虚拟 DOM(React 等)可以改善频繁更新的性能。
-
使用懒加载(图片 / 模块)减少首屏加载。使用
requestAnimationFrame做视觉帧同步操作。
17. 安全:XSS、CSP、CORS
-
XSS(跨站脚本):避免直接把不受信任的字符串插入
innerHTML,对用户输入进行转义或使用模板引擎。 -
CSP(内容安全策略):通过响应头
Content-Security-Policy限制可执行脚本来源,降低 XSS 风险。 -
CORS:跨域资源共享,需要服务器设置
A***ess-Control-Allow-Origin等头部;前端无需特殊配置,但需了解预检请求(OPTIONS)。
18. 常见面试题与练习题(含参考答案要点)
-
解释
this是如何工作的?(取决于调用方式:全局、方法、构造函数、call/apply/bind、箭头函数无this) -
什么是闭包?举例场景。(缓存、信息封装、函数工厂)
-
描述事件循环和微任务/宏任务的区别,并说明输出顺序。
-
Promise 的状态有哪些?如何链式处理错误?(pending -> fulfilled/rejected)
-
用
fetch发起请求并处理 4xx/5xx 错误。
(我可以把每道题写成详细答案与示例代码,如果你需要。)
19. 实战项目建议(从易到难)
-
Todo List(局部状态、事件、DOM、localStorage)
-
天气查询应用(fetch、异步、错误处理、UI 反馈)
-
简单 SPA(无库)(Hash 路由、模板渲染)
-
聊天客户端(WebSocket)(实时通信)
-
小型前端框架复刻(理解虚拟 DOM、组件化)
我可以为某个项目生成完整源码并打包成可下载仓库。
20. 学习路线与资源
-
先掌握 ES6+ 语法(let/const、箭头、解构、模板、Promise、async/await)。
-
同步学习 DOM 与浏览器 API。
-
做 3 个小项目并部署(GitHub Pages / ***lify)。
-
深入理解事件循环、性能优化与安全。
-
学习框架(React、Vue 或 Svelte)并构建一个中等项目。
推荐资源:MDN、You Don't Know JS(书籍)、Frontend Masters、Google Developers、V8 博客。
21. 实用技巧速查
-
使用
console.table()查看数组/对象表格。 -
debugger;语句可触发断点。 -
JSON.parse(JSON.stringify(obj))可作浅拷贝(但有局限)。 -
使用
structuredClone(obj)(现代浏览器)进行深拷贝。
22. 结语
JavaScript 是一门充满奇妙与灵活性的语言。掌握它需要时间与实践:读懂语言、读懂浏览器、做项目、复盘错误。如果你完成本文并练习了推荐项目,你将具备成为一名合格前端开发者的坚实基础。