我只是來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