Javascript中的高阶函数
我正在阅读雄辩的JavaScript(),我已经讲到了关于高阶函数的部分,我对下面代码中发生的事情感到困惑Javascript中的高阶函数,javascript,function,higher-order-functions,Javascript,Function,Higher Order Functions,我正在阅读雄辩的JavaScript(),我已经讲到了关于高阶函数的部分,我对下面代码中发生的事情感到困惑 function noisy(f) { return function(arg) { console.log("calling with", arg); var val = f(arg); console.log("called with", arg, "- got", val); return val; }; } noisy(Boolean)(0)
function noisy(f) {
return function(arg) {
console.log("calling with", arg);
var val = f(arg);
console.log("called with", arg, "- got", val);
return val;
};
}
noisy(Boolean)(0);
// → calling with 0
// → called with 0 - got false
noisy(Boolean)(0)
var val = f(arg);
Boolean
是一个函数。这是您通过noise
间接调用的函数。我知道有点混乱,因为它看起来像一个类型的名称。但是在JavaScript中,那些最初被限制的东西(布尔值
、数字
、字符串
,等等)是函数。当您使用new
调用Boolean
(而不使用new
)时,它会尝试将您提供的参数转换为Boolean
原语值并返回结果。(参见规范中的。)f
是noised
函数中参数的名称noisy(Boolean)(0)
有两件事正在发生。第一:
// (In effect, we're not really creating a variable...)
var x = noisy(Boolean);
这给了我们一个函数,当被调用时,它将使用我们给出的参数调用Boolean
,同时执行那些console.log
语句。这是您在noised
(返回函数(arg)…
)中看到的正在创建的函数
然后我们称之为函数:
x(0);
这时您将看到控制台输出。由于Boolean(0)
是false
,因此可以看到Boolean
返回该值
下面是一个简单得多的例子:
function foo(bar) {
bar();
}
function testing() {
alert("testing got called");
}
foo(testing);
在这里,我将函数testing
传递到foo
。我在foo
中使用的参数名是bar
。行bar()
调用函数。没有()的函数是实际函数。带有()的函数是对该函数的调用。还请记住,JavaScript是一种松散类型的语言,因此不声明变量类型。我在您的示例中添加了一些注释,以尝试提供帮助
// We define a function named noisy that takes in an argument named f. We are expecting f to be a function but this isn't enforced till the interpreter throws an error.
function noisy(f) {
// Noisy returns a single item, an anonymous function. That anonymous function takes in an argument named arg
return function(arg) {
console.log("calling with", arg);
// Our anonymous function then takes f (It can use f because its defined inside noisy, see closures for more details) and invokes it with the argument arg and stores the result in a variable named val.
var val = f(arg);
console.log("called with", arg, "- got", val);
// It now returns val
return val;
};
}
那么Noised(Boolean)(0)就是这样工作的
function(arg) {
var val = Boolean(arg);
return val;
}
f是布尔函数
Noised返回如下函数
function(arg) {
var val = Boolean(arg);
return val;
}
现在我们有了
我们返回的函数(0)
它执行起来就像正常的一样
function(0) {
var val = Boolean(0); // false
return val;
}
我对JS相对来说是新手,我也刚刚阅读了有说服力的Javascript,我发现一旦我理解了函数的调用(回答您的第1点),就更容易理解了:
noised(Boolean)
创建一个新函数,(0)
在它后面,因为它是作为参数传递到该新函数中的。如果您返回到大于的示例:
function greaterThan(n) {
return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
也可以这样称呼它:
greaterThan(10)(11);
我希望这能澄清你的第一个问题,即为什么这样称呼它
关于第二个问题。f
在:
var val = f(arg);
是输入noised(Boolean)
时传递到noised
的Boolean
函数。然后,它被用作嘈杂函数中的参数。我也没有意识到布尔值本身可能是一个函数,而不仅仅是一种数据类型。正如其他人所说,它将您提供的参数转换为布尔值并返回结果
因此,val
变成Boolean(arg)
变成Boolean(0)
,计算结果为false
。如果您尝试调用noised(Boolean)(1)
您将看到它返回true
。console.log(“调用时使用”,arg,“-get”,val)
只记录参数(本例中为0)和计算结果(false)
实际上,它已将布尔函数更改为记录参数和结果以及返回结果的函数
我希望这有帮助。写下它有助于我自己的理解。如果你在这方面仍然有问题,以下是我的理解方式(它也让我头疼……) 函数只是一个常规值。上一句话是理解这里发生的事情的关键 我们的噪声(f)函数是一个值。这是它的回报 Noised(f)返回带参数(arg)的函数。 Noised(f)也接受参数(f)。内部函数(从函数内部调用的函数)可以访问传递给外部函数的变量和参数 我们调用外部函数并将参数传递给它。我们的外部函数返回其内部函数,该函数接受一个参数(0)。 通过理解上面的内容,我们可以清楚地看到,Noised(Boolean(0))只需将一个参数传递给外部函数, 而不向外部函数返回的内部函数传递任何内容
真的很简单。现在我们明白了,很难相信它让我们一开始就这么头疼*/` Javascript变量没有静态数据类型。也可以为它们分配不同数据类型的变量 JS中没有像JAVA等中那样的类型转换概念 ()在函数调用中对应于函数的调用 这里,布尔函数似乎是一个高阶函数,它作为参数传递给带噪函数。噪声功能的结果将是
函数(arg){
log(“调用”,arg);
var=f(arg);
log(“调用时使用”,arg,“-get”,val);
返回val;
};
@Crowder:但是如果那些最初被封顶的东西(布尔值、数字、字符串等等)是函数,为什么var x=Number(5);警报(x类型);//数量;警觉的
function noisy(f) {
return function(arg) {
console.log("calling with", arg);
var val = f(arg);
console.log("called with", arg, "- got", val);
return val;
};
}
noisy(Boolean)(0)