JavaScript的高阶函数

7

能有人解释一下下面的代码是在干什么吗?这个函数的参数是n,那么m从哪里来的呢?整个代码让人困惑不已...如果有人能解释一下就好了。

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

7
这展示了一种函数式编程技术,叫做柯里化(也与部分函数应用相关)。
大于符号 > 通常需要两个参数(一个在左边,一个在右边)。这是一种逐个提供参数的方法。
如果您将其内联调用,则可能更容易看到正在发生的情况:
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

6

m是在第二次调用时传入的11

当你调用greaterThan(10)时,它会返回一个新函数,看起来像这样:

function(m) {
    return m > 10;
}

这段代码将被保存为greaterThan10。这被称为柯里化


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); 

2

greaterThan 是一个返回另一个函数的函数,m 是返回函数的参数。因此在你的代码中:

var greaterThan10 = function(m) { return m > 10; };

console.log(greaterThan10(11));

等同于

console.log(11 > 10);

1

你有两个函数。

n 来自第一个函数被调用时。

m 来自第二个函数(即第一个函数的返回值)被调用时。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接