我只是来javascript。我遇到了这样的代码。Javascript,调用嵌套函数
function makeAdder(a) {
return function(b) {
return a + b;
};
}
x = makeAdder(5);
这里的X(6)是11.这似乎X这里处于 “uncomplete” 状态,等待另一种说法来完成价值? 我不知道这是如何工作的。有人可以向我解释吗?任何参考将不胜感激。
我只是来javascript。我遇到了这样的代码。Javascript,调用嵌套函数
function makeAdder(a) {
return function(b) {
return a + b;
};
}
x = makeAdder(5);
这里的X(6)是11.这似乎X这里处于 “uncomplete” 状态,等待另一种说法来完成价值? 我不知道这是如何工作的。有人可以向我解释吗?任何参考将不胜感激。
这是某些函数式编程语言中的常用技术。
在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
或
var add6 = g(6);
add6(10); //=> 16;
但是,如果您始终想要分两步执行此操作,您可以按照您的makeAdder
的方式进行定义。
如果你对这种编程风格感兴趣,有一些库试图帮助它。我个人最喜欢的是Ramda(免责声明:我是拉姆达的核心贡献者。)
我一直觉得返回其他函数的函数叫做_factories_。这是不正确的? –
@PatrickRoberts:“工厂”通常是函数的一个通用术语,它返回对象,但不用'new'调用,因此不是构造函数/构造函数。他们对施工人员做类似的工作,但更灵活。 –
@ScottSauyet感谢澄清。现在我知道如何正确使用这个词了! –
好的,这是我的解释。所以你的函数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
- 一个被设置为任何我们通过到第一功能,并且不改变
x = makeAdder(5);
现在我们运行的原有功能,在经过5。5将涓滴到新的功能(还记得它不会改变),而我们得到的回复是将该参数添加到5的新功能。 x
现在正在存储该新功能。
x(6);
这是我们运行存储在x
新的功能 - 而我们在6传递新的功能将增加6到我们在早些时候通过的5,和我们回到11
这是一个模式调用部分应用程序。它允许在知道b之前对其进行高速缓存,允许在多个调用之间共享:
x = makeAdder(5);
a = x(6); // 11
b = x(7); // 12
c = x(8); // 13
“部分应用程序”通常用于描述像函数add(a ,b){return a + b;}'提供一个值,但函数仍然返回。这有些不同。 –
查看http://stackoverflow.com/questions/35167934/javascript-why-return-function-in-a-function – guest271314
可能的重复[JavaScript关闭如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Douglas