2015-05-03 200 views
7

有人可以向我解釋下面的代碼中發生了什麼。該功能正在接收n作爲參數,那麼m從哪裏來?整個代碼很混亂..如果有人能解釋?高階javascript函數

function greaterThan(n) { 
    return function(m) { return m > n; }; 
    } 
    var greaterThan10 = greaterThan(10); 
    console.log(greaterThan10(11)); 
    // → true 

回答

7

這是一種功能性編程技術,被稱爲currying。 (也與partial function appliction相關)

大於>通常需要2個參數(一個在左邊,一個在右邊)。這是一種一次餵食一種的方法。

這可能是更容易地看到發生了什麼,如果你在線叫它:

greaterThan(10)(11); 

正如你可以從上面的例子看到,10被傳遞中的n參數,然後11被傳遞爲m參數。

該經過10第一應用輸出一個函數,如下所示:

function(m) { return m > 10; }; 

這是在部分應用程序中的第一應用

從那裏可以很容易地看到11是如何通過以獲得最終結果的。

因此,要打破它:

function greaterThan(n) { 
    return function(m) { return m > n; }; 
} 

//var greaterThan10 = greaterThan(10); -- is equivalent to: 
var greaterThan10 = function(m) { return m > 10; }; 

console.log(greaterThan10(11)); //--> true 
+0

由於現在很清楚.. – whatever

6
m

11,第二呼叫期間傳遞英寸

當你調用greaterThan(10),它返回一個新的功能,看起來像:

function(m) { 
    return m > 10; 
} 

,然後將其保存爲greaterThan10。這被稱爲currying

1

你有兩個功能在那裏。

n來自第一個函數被調用時。

m來自第二個函數(它是第一個函數的返回值)被調用時。

greaterThan10 = greaterThan(10); 
//       ^^ n 
greaterThan10(11)) 
// ^^ returned function 
//   ^^ m 
+0

謝謝!!!!!!! – whatever

2

greaterThan是返回另一個函數作爲結果函數,m就是一個paraterer返回的函數。因此,在你的代碼: var greaterThan10 = function(m) { return m > 10; };

console.log(greaterThan10(11));相同console.log(11 > 10);

+1

謝謝!這是一個真正的幫助.. – whatever

2

當你調用函數greaterThan它返回另一個功能,但不是一個數字浮動。內部函數知道n,因爲它內部函數greaterThan

由於包裝函數返回另一個功能,你可以這樣調用

var result = greaterThan(10)(11); 

第一個參數10將用於包裝的功能,但結果第二個是功能,讓您可以立即傳遞參數的內部函數。 這是可能的,只有你有return function(){...}

你可以嘗試像

var a = function (x){ 
     return function(y){ 
      return function(z){ 
       return x*y*z; 
      } 
      } 
     } 
var result = a(5)(3)(8);