前端核心面试题精粹
JavaScript 基础与核心机制
闭包(Closure)
定义:闭包是指一个函数能够访问并记住其外部作用域中的变量,即使外部函数已经执行完毕。它由两部分组成:一个函数(通常是内部函数)以及该函数被创建时所在的作用域。
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 是单线程语言,通过事件循环机制实现异步非阻塞。
核心概念:
- 调用栈(Call Stack):存储函数调用,遵循后进先出。
- 任务队列:分为宏任务(Macro Task)和微任务(Micro Task)。
- 宏任务:
setTimeout,setInterval, I/O, UI 渲染。 - 微任务:
Promise.then,MutationObserver,process.nextTick。
- 宏任务:
执行流程:
- 执行同步代码(调用栈)。


