MST

星途 面试题库

面试题:JavaScript 闭包在复杂异步场景中的应用与优化

假设有一个需要处理多个异步操作(如多个 AJAX 请求)的场景,且每个异步操作的结果依赖上一个操作的结果,同时要利用闭包来管理中间状态。请用 JavaScript 实现该场景,并阐述如何对其进行性能优化以避免闭包可能带来的性能瓶颈。
20.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

JavaScript 实现

function asyncOperations() {
    let intermediateState = null;

    return function nextOperation(result) {
        if (result) {
            intermediateState = result;
        }

        // 模拟异步操作,这里用 setTimeout 代替实际的 AJAX 请求
        return new Promise((resolve) => {
            setTimeout(() => {
                // 这里对 intermediateState 进行操作,生成新的结果
                const newResult = intermediateState? intermediateState + 1 : 1;
                resolve(newResult);
            }, 1000);
        });
    };
}

// 使用
const operation = asyncOperations();
operation()
   .then(result => operation(result))
   .then(result => operation(result))
   .then(finalResult => {
        console.log('Final result:', finalResult);
    });

性能优化避免闭包性能瓶颈

  1. 减少闭包持有变量的生命周期:在异步操作完成后,及时释放闭包内不再需要的变量。例如,如果 intermediateState 在后续操作中不再需要,可以在使用完后将其设置为 null,让垃圾回收机制回收其占用的内存。
  2. 避免过度嵌套闭包:复杂的嵌套闭包会增加作用域链的长度,导致变量查找变慢。尽量将逻辑拆分,使闭包结构简单明了。
  3. 使用 WeakMap 或 WeakSet:如果闭包需要持有对其他对象的引用,且不希望这些对象因为被闭包引用而无法被垃圾回收,可以使用 WeakMapWeakSet。它们的键或值是弱引用,当对象没有其他强引用时,垃圾回收机制可以回收该对象。
  4. 节流与防抖:如果闭包内涉及频繁触发的操作,如事件监听回调,可以使用节流(throttle)或防抖(debounce)技术,减少操作的执行频率,从而提高性能。