2016-11-20 26 views
0

我從Headfirst Javascript書中得到了這段代碼。我將函數名稱更改得更清晰。我正在試圖圍繞這個包裹我的頭。試圖理解這個函數作爲值

我用一個數字賦值給函數outer。這個數字仍然是由於某種原因 - 返回一個內部參考n = num(它返回的是增加的值?

任何時候我改變外部n值,內部將使用該新值? 我相信我是對的即,是否有任何地方我可以閱讀更多關於它?看到更好的例子嗎?或者,任何人都可以解釋這更好的?

function outer(n) { 
 
\t var inner = function(x) { //or x = 0 
 
    \t return n + (x || 0); //added default 0 for testing to prevent NaN 
 
    } 
 
    return inner; 
 
} 
 
var num = 2; 
 
var add = outer(num); 
 
console.log(`Adding 2 to num(${num}): ${add(2)}`); 
 

 
add = outer(5); 
 
console.log(add()); 
 
console.log(add(2));

+0

什麼是你的** **的實際問題? **重新定義**您的**真實**問題並重試。你的例子是**有缺陷** - theres沒有函數稱爲'add2()' – Xatenev

+1

我認爲你正在尋找的單詞是*部分應用*和*咖啡*。使用這些術語,你應該能夠在網上找到解釋 – UnholySheep

回答

1

在JavaScript中,函數可以充當常規數據。如果你對傳遞數字或字符串的想法沒有問題,那麼傳遞一個函數也不例外。這讓你有能力做一些非常酷且有力的事情。

這裏,而不是add函數簡單地給你你的數字答案,它會給你一個函數與你的數字嵌入到它。這意味着add不會真的添加任何東西,add是創建函數的函數(類似於基於類的編程中的「Factory」)。

更改名稱可能使事情變得更加容易:

function createAddFunction(numberThatWillBeHardWiredIntoReturnedFunction) { 
    var resultingFunction= function(x) { //or x = 0 
    return numberThatWillBeHardWiredIntoReturnedFunction + (x || 0); 
    } 
    return resultingFunction; 
} 
var num = 2; 

// This will cause add to be a function that is hard-wired to add 2 to another number 
var add = createAddFunction(num); 
console.log(`Adding 2 to num(${num}): ${add(2)}`); 

// This will cause add to be a function that is hard-wired to add 5 to another number 
add = createAddFunction(5); 
console.log(add()); 
console.log(add(2)); 
+0

是的,這些名字完全有所作爲。在這本書中,這只是一個挑戰。當我輸入它時,它開始有意義。所以我將這些函數重命名爲outer/inner。另外,根據這裏的其他人的建議,我會閱讀柯里。儘管我喜歡你的答案! –

1

讓我們重命名功能,使之更加清晰。外部函數取一個參數並用它來創建一個新的函數函數返回供將來使用。

function createFunctionThatAdds(n){ 
 
    var adds_n = function(x) { return n + (x || 0); }; 
 
    return adds_n; 
 
} 
 

 
var adds_2 = createFunctionThatAdds(2); 
 
var adds_5 = createFunctionThatAdds(5); 
 

 
console.log(adds_2(10)); 
 
console.log(adds_5(10));

+0

所以,這種'技術'幾乎創造了功能。是否有一個詞(所以我可以讀它)? –

+0

這是沒有真正的'技術',你只是返回一個函數進一步使用,以防止**冗餘**代碼(因爲你將不得不定義'add2()'和'add5()'和加號操作兩次。) – Xatenev

+1

@TinklePooplebottham這可能有助於http://stackoverflow.com/q/111102/4475267 – noisypixy

1

使用的技術被稱爲currying。它是功能性JavaScript的一部分。

您可以閱讀更多關於它here

它背後的想法是,你可以使用一個函數來生成另一個函數,你可以在你的代碼中進一步使用它。

由於closure的原因,使得捲曲成爲可能。

有很多基於該principe構建的庫,例如Ramda