2016-02-14 138 views
3

我只是来javascript。我遇到了这样的代码。Javascript,调用嵌套函数

function makeAdder(a) { 
    return function(b) { 
     return a + b; 
    }; 
} 
x = makeAdder(5); 

这里的X(6)是11.这似乎X这里处于 “uncomplete” 状态,等待另一种说法来完成价值? 我不知道这是如何工作的。有人可以向我解释吗?任何参考将不胜感激。


+1

查看http://stackoverflow.com/questions/35167934/javascript-why-return-function-in-a-function – guest271314

+0

可能的重复[JavaScript关闭如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Douglas

回答

4

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

在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(免责声明:我是拉姆达的核心贡献者。)

+0

我一直觉得返回其他函数的函数叫做_factories_。这是不正确的? –

+1

@PatrickRoberts:“工厂”通常是函数的一个通用术语,它返回对象,但不用'new'调用,因此不是构造函数/构造函数。他们对施工人员做类似的工作,但更灵活。 –

+0

@ScottSauyet感谢澄清。现在我知道如何正确使用这个词了! –

0

好的,这是我的解释。所以你的函数makeAdder()返回另一个函数,它会将参数a添加到b。当您运行makeAdder(5),你取回一个功能与参数a设置为5

现在你已经增加了一个参数5.功能当你调用x(6),你又回到5 + 6

把你的脑袋全部弄清楚是有点困难的,我必须经过几分钟才能理解它。这里有一个一步一步:

function makeAdder(a) { 

在这里,我们初始化makeAdder()作为接受单个参数的函数,a

return function(b) { 

我们的函数会返回一个新的函数,它接受一个单一的参数,b

 return a + b; 

这个新的函数返回ab - 一个被设置为任何我们通过到第一功能,并且不改变

x = makeAdder(5); 

现在我们运行的原有功能,在经过5。5将涓滴到新的功能(还记得它不会改变),而我们得到的回复是将该参数添加到5的新功能。 x现在正在存储该新功能。

x(6); 

这是我们运行存储在x新的功能 - 而我们在6传递新的功能将增加6到我们在早些时候通过的5,和我们回到11

0

这是一个模式调用部分应用程序。它允许在知道b之前对其进行高速缓存,允许在多个调用之间共享:

x = makeAdder(5); 

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

“部分应用程序”通常用于描述像函数add(a ,b){return a + b;}'提供一个值,但函数仍然返回。这有些不同。 –