You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS面试题辨析:makeAdder代码示例是Currying还是Closure?

问题解答

首先给出题目中的示例代码:

function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

var addFive = makeAdder(5);
console.log(addFive(3)); // 输出8

先明确两个概念的边界

  • 闭包(Closure):是JavaScript的基础语言特性,指内层函数可以访问定义它的外层词法作用域的变量,哪怕内层函数拿到外层执行也能保留对原作用域的访问。这段代码里返回的匿名函数确实用到了闭包来记住x的值,你认为它用到了闭包的特性是完全正确的。
  • 柯里化(Currying):是一种函数式编程的技术模式,指把接收多个参数的函数,转换为一系列只接收单个参数的函数,调用时可以分批传入参数。这段代码的核心结构就是把原本需要同时传x和y两个参数的加法函数,拆成了两次接收单个参数的调用,这是柯里化的标准实现示例。

为什么考题答案选柯里化

这道题的考察核心是「代码实现的核心技术模式」,而不是代码依赖的基础特性:

闭包是实现柯里化用到的底层能力,就像你用砖砌了一堵墙,问你这是什么,答案是墙而不是砖。

如果题目要考察闭包,通常会给出更侧重作用域访问特性的场景,比如循环中异步函数保留变量、模块模式封装私有变量这类示例,不会刻意设计成多参数分批传入的结构。你觉得两个都符合逻辑是完全合理的,只是这道题的考点是识别上层的设计模式,而非底层用到的语言特性。

内容的提问来源于stack exchange,提问作者kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:27:00