前端核心面试题与实战知识点梳理
JavaScript 基础与原理
闭包:定义与应用
闭包是指函数能够访问并记住其外部作用域中的变量,即使外部函数已经执行完毕。它由两部分组成:一个函数(通常是内部函数)以及该函数被创建时所在的作用域。
function outer() {
let count = 0;
function inner() {
count++;
console.log(count);
}
return inner;
}
const counter = outer();
counter(); // 输出 1
counter(); // 输出 2
核心原理:
- 作用域链:函数在定义时记录词法环境,访问变量时沿作用域链向上查找。
- 变量持久化:闭包使得外部变量不会被垃圾回收,因为内部函数仍持有引用。
常见用途:
- 私有变量封装:隐藏内部状态,仅暴露操作接口。
- 函数柯里化:将多参数函数转换为单参数链式调用。
- 事件处理:在回调中保留上下文变量。
陷阱与解决:
- 循环问题:
var声明的变量在循环中共享,导致setTimeout输出相同值。使用let或 IIFE 可创建块级作用域隔离。 - 内存泄漏:长期持有大对象引用可能导致内存无法释放。不需要时应手动解除引用。
事件循环(Event Loop)
JavaScript 是单线程语言,通过事件循环机制实现异步非阻塞模型。
核心概念:
- 调用栈:存储函数调用,遵循后进先出原则。
- 任务队列:分为宏任务(如
setTimeout、I/O)和微任务(如Promise.then、MutationObserver)。
执行流程:
- 执行同步代码直到调用栈为空。
- 执行所有微任务。
- 执行一个宏任务。
- 渲染 UI(如需),重复上述步骤。
console.log();
( .(), );
.().( .());
.();


