MST

星途 面试题库

面试题:JavaScript 函数实参与形参兼容性的深度探究及优化

在JavaScript中,有一个函数`function complexCalculation(a, b, callback) { let result = a + b; return callback(result); }`。假设调用这个函数时,传入的实参`callback`不是一个函数,如何优雅地处理这种实参与形参不兼容的情况,同时确保代码的健壮性和可维护性?另外,在实际应用场景中,如何对这种函数进行性能优化,尤其是在高频调用且实参可能多变的情况下?请从函数设计、参数校验、内存管理等多个角度阐述你的思路,并给出相应代码示例。
39.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

处理实参与形参不兼容情况

在调用 complexCalculation 函数时,我们需要对传入的 callback 参数进行类型检查,确保它是一个函数。如果不是函数,可以抛出一个错误或者返回一个默认值,以保证代码的健壮性。

function complexCalculation(a, b, callback) {
    if (typeof callback!== 'function') {
        throw new Error('The callback parameter must be a function');
    }
    let result = a + b;
    return callback(result);
}

性能优化思路

  1. 函数设计

    • 缓存结果:如果计算结果在高频调用场景下不会改变,可以考虑缓存计算结果,避免重复计算。
    • 减少函数调用开销:尽量避免在 complexCalculation 函数内部进行复杂且不必要的操作,以减少函数调用的开销。
  2. 参数校验

    • 提前校验:在函数外部对参数进行校验,避免在高频调用的函数内部重复进行校验操作,提高性能。
  3. 内存管理

    • 避免内存泄漏:确保 callback 函数没有引用外部变量,避免在函数执行完毕后仍然持有不必要的引用,导致内存泄漏。

代码示例

  1. 缓存结果
let cache = {};
function complexCalculationCached(a, b, callback) {
    const key = `${a}-${b}`;
    if (cache[key]) {
        return callback(cache[key]);
    }
    let result = a + b;
    cache[key] = result;
    return callback(result);
}
  1. 提前校验
function validateCallback(callback) {
    if (typeof callback!== 'function') {
        throw new Error('The callback parameter must be a function');
    }
}

function complexCalculationOptimized(a, b, callback) {
    let result = a + b;
    return callback(result);
}

// 调用时提前校验
let callbackFunction = function (result) {
    return result * 2;
};
validateCallback(callbackFunction);
let result = complexCalculationOptimized(2, 3, callbackFunction);
console.log(result);