能有人解释一下下面的代码是在干什么吗?这个函数的参数是n
,那么m
从哪里来的呢?整个代码让人困惑不已...如果有人能解释一下就好了。
function greaterThan(n) {
return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
// → true
能有人解释一下下面的代码是在干什么吗?这个函数的参数是n
,那么m
从哪里来的呢?整个代码让人困惑不已...如果有人能解释一下就好了。
function greaterThan(n) {
return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
// → true
>
通常需要两个参数(一个在左边,一个在右边)。这是一种逐个提供参数的方法。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
m
是在第二次调用时传入的11
。
当你调用greaterThan(10)
时,它会返回一个新函数,看起来像这样:
function(m) {
return m > 10;
}
这段代码将被保存为greaterThan10
。这被称为柯里化。
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);
greaterThan
是一个返回另一个函数的函数,m
是返回函数的参数。因此在你的代码中:
var greaterThan10 = function(m) { return m > 10; };
和
console.log(greaterThan10(11));
等同于
console.log(11 > 10);
你有两个函数。
n
来自第一个函数被调用时。
m
来自第二个函数(即第一个函数的返回值)被调用时。
greaterThan10 = greaterThan(10);
// ^^ n
greaterThan10(11))
// ^^ returned function
// ^^ m