MST

星途 面试题库

面试题:JavaScript 函数定义与调用方式之专家题

实现一个高阶函数 `compose`,它接受多个函数作为参数,返回一个新函数。新函数执行时,会按照从右到左的顺序依次调用传入的函数,将前一个函数的返回值作为下一个函数的参数,例如 `compose(f, g, h)(x)` 等同于 `f(g(h(x)))`。请使用 JavaScript 实现该 `compose` 函数,并说明实现过程中对函数定义与调用方式的理解和应用。
34.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function compose(...funcs) {
    return function (arg) {
        return funcs.reduceRight((acc, func) => {
            return func(acc);
        }, arg);
    };
}

实现过程中对函数定义与调用方式的理解和应用

  1. 函数定义
    • compose 函数使用了 ES6 的剩余参数语法 ...funcs,它可以将所有传入的函数收集到一个数组 funcs 中。
    • 然后返回一个匿名函数,这个匿名函数接受一个参数 arg,这是整个函数链开始执行的初始值。
  2. 函数调用
    • 使用 reduceRight 方法,它会从数组的最后一个元素开始,到第一个元素结束依次对数组中的元素执行一个累加器函数。
    • 累加器函数接受两个参数:acc(累加器累计回调的返回值)和 func(当前数组元素,即当前要执行的函数)。
    • 在每次迭代中,func 函数会被调用,并将 acc 作为参数传入,其返回值会作为下一次迭代的 acc
    • 最终 reduceRight 会返回整个函数链执行后的结果。这样就实现了从右到左依次调用传入的函数,并将前一个函数的返回值作为下一个函数的参数。