Javascript,对嵌套函数的调用

Javascript,对嵌套函数的调用,javascript,closures,Javascript,Closures,我刚开始学习javascript。我遇到了这样的代码 function makeAdder(a) { return function(b) { return a + b; }; } x = makeAdder(5); 这里x(6)的值是11。似乎x这里处于“未完成”状态,等待另一个参数完成? 我不知道这是怎么回事。谁能给我解释一下吗?如有任何参考,将不胜感激 好的,这是我的解释。因此,函数makeAdder()返回另一个函数,该函数将把参数a添加到b。当您运行make

我刚开始学习javascript。我遇到了这样的代码

function makeAdder(a) {
   return function(b) {
       return a + b;
   };
}
x = makeAdder(5);
这里x(6)的值是11。似乎x这里处于“未完成”状态,等待另一个参数完成? 我不知道这是怎么回事。谁能给我解释一下吗?如有任何参考,将不胜感激


好的,这是我的解释。因此,函数
makeAdder()
返回另一个函数,该函数将把参数
a
添加到
b
。当您运行
makeAdder(5)
时,您将返回一个参数
a
设置为5的函数

现在您有了一个函数,该函数向5添加了一个参数。当你呼叫
x(6)
时,你得到的是5+6

要想让你了解整件事有点困难,我不得不花几分钟的时间来理解它。这里有一个逐步的步骤:

function makeAdder(a) {
在这里,我们将makeAdder()初始化为一个函数,它只接受一个参数,
a

   return function(b) {
我们的函数将返回一个采用单个参数的新函数,
b

       return a + b;
这个新函数返回
a
b
-a被设置为我们传入第一个函数的值,并且不会改变

x = makeAdder(5);
现在我们运行原始函数,传入5。5将逐渐进入新函数(记住它不会改变),我们得到的是将5添加到参数的新函数
x
现在正在存储该新函数

x(6);

这是我们运行存储在
x
中的新函数,我们将传递6。新函数将在我们前面传递的5中添加6,然后返回11。

这是一个模式调用部分应用程序。它允许在知道b之前缓存a它允许跨多个调用共享a:

x = makeAdder(5);

a = x(6);  // 11
b = x(7);  // 12
c = x(8);  // 13

这是某些函数式编程语言中的常见技术

在Javascript中很简单,因为函数是一级值,我们可以将它们作为参数提供给其他函数,将它们存储为对象的属性或变量,或者像在本例中一样,从其他函数返回它们

这称为高阶函数,因为它要么接受函数参数,要么返回函数结果

Javascript中的值具有全局作用域或函数作用域。参数
a
在外部函数的作用域中可用,由于内部函数是在该作用域中创建的,因此它可以访问变量
a
。这称为闭包

许多库提供了一个
curry
函数,它封装了一个普通函数,例如

function f(a, b) {
  return a + b;
}
改为使用:

var g = curry(function f(a, b) {
  return a + b;
});
所以现在你可以称之为

g(6, 36); //=> 42
或作为

但是,如果您总是希望分两步完成此操作,那么可以像
makeAdder
那样定义它


如果您对这种编程风格感兴趣,有很多库可以帮助您。我个人最喜欢的是(免责声明:我是Ramda的核心贡献者。)

参见“部分应用程序”的可能副本通常用于描述函数,如
function add(a,b){return a+b;}
,其中一个值是提供的,但函数仍然返回。这有点不同。我一直认为返回其他函数的函数称为工厂。这是错误的吗?@PatrickRoberts:“工厂”通常是返回对象的函数的通用术语,但这些对象不是用
new
调用的,因此不是构造函数/构造函数。“他们的工作与构造函数类似,但更灵活。”ScottSauyet感谢您的澄清。现在我知道如何正确使用这个词了!
var add6 = g(6);
add6(10);  //=> 16;