来自这个关于闭包的文档:
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 7
console.log(add10(2)); // 12
我不明白makeAdder(5)
参数是如何作为x
接收的,但在add5(2)
中它是y
的。
我希望它两次都说y is undefined
。 谁能解释一下它是如何工作的?
当你调用makeAdder()
时,它会返回一个函数(而不是一个值)。因此,要使用它,您将拥有类似的东西
makeAdder(4)(5)
这会将 4 加到 5 并返回 9。同样,makeAdder()
这里返回另一个函数,这就是为什么我在它之后调用了一个参数((5)
)。
如果你想进一步阅读,这是JavaScript中的一个概念,称为currying。它是一种函数式编程技术。
当调用add5 = makeAdder(5);
时,基本上正在发生的事情是:
add5 = function(y){
return 5 + y;
}
在这一点上,add5(y)
会给你y + 5
.
正如您从评论中注意到的那样,您可以使用makeAdder(x)(y)
,这本质上是做同样的事情,它归结为:
(function(y){return x + y})(y);
makeAdder
x
获取参数,并返回一个可以看到x
的函数(谷歌:"闭包"),并且还采用自己的参数y
。