2016-02-14 106 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;}'提供一個值,但函數仍然返回。這有些不同。 –