2025-08-19 模拟面试(一)
一、JavaScript 深度考察
闭包与内存管理
- 请实现一个防抖函数(debounce),并说明它如何利用闭包避免内存泄漏?如果在 React 函数组件中使用,需要注意什么?
function debounce(fn, delay) { let timer = null; return function (...args) { clearTimeout(timer); timer = setTimeout(() => { fn.call(this, args); }, delay); }; }
- 如何通过 Chrome DevTools 检测闭包导致的内存泄漏?请描述具体步骤。
- 录制内存快照
- 筛选 Detached HTMLDivElement 等 DOM 节点
- 查看闭包引用链(Closure Scope)
异步与事件循环
- 以下代码的输出顺序是什么?解释原因:
console.log(1); setTimeout(() => console.log(2), 0); Promise.resolve().then(() => console.log(3)); console.log(4);
- 如何用 Promise 实现一个带超时控制的 fetch 请求?如果请求超时后,如何取消实际网络请求(不是仅仅忽略结果)?
function fetchWithAbort(url, timeout) { const controller = new AbortController(); let timer = null; timer = setTimeout(() => { controller.abort(); clearTimeout(timer); }, timeout); return fetch(url, { singal: controller.singal, }).finally(() => { clearTimeout(timer); }); }
虚拟列表方案在快速滚动时可能出现空白,如何解决?
- 该问题确实会出现,尤其是在动态高度确定的情况下
- 究其原因还是滚动触发速度远远大于渲染速度
- 可以考虑实施如下操作进行进一步优化
- 临时展示骨架屏
- 多渲染一部分内容,比如 20%左右
- 添加一下 will-change: tranform 来提升渲染层
- 这个问题没有准确的解决方案,在低端机还可能出现卡顿现象,需要平衡加载,性能的平衡。