2025-08-19 模拟面试(一)

一、JavaScript 深度考察
  1. 闭包与内存管理

    1. 请实现一个防抖函数(debounce),并说明它如何利用闭包避免内存泄漏?如果在 React 函数组件中使用,需要注意什么?
    function debounce(fn, delay) {
      let timer = null;
      return function (...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
          fn.call(this, args);
        }, delay);
      };
    }
    
    1. 如何通过 Chrome DevTools 检测闭包导致的内存泄漏?请描述具体步骤。
      1. 录制内存快照
      2. 筛选 Detached HTMLDivElement 等 DOM 节点
      3. 查看闭包引用链(Closure Scope)
  2. 异步与事件循环

    1. 以下代码的输出顺序是什么?解释原因:
    console.log(1);
    setTimeout(() => console.log(2), 0);
    Promise.resolve().then(() => console.log(3));
    console.log(4);
    
    1. 如何用 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);
      });
    }
    
  3. 虚拟列表方案在快速滚动时可能出现空白,如何解决?

    1. 该问题确实会出现,尤其是在动态高度确定的情况下
    2. 究其原因还是滚动触发速度远远大于渲染速度
    3. 可以考虑实施如下操作进行进一步优化
      1. 临时展示骨架屏
      2. 多渲染一部分内容,比如 20%左右
      3. 添加一下 will-change: tranform 来提升渲染层
    4. 这个问题没有准确的解决方案,在低端机还可能出现卡顿现象,需要平衡加载,性能的平衡。

results matching ""

    No results matching ""