2015-05-03 136 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);