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
相关产品推荐
相关产品推荐

