JavaScript - 这个高阶函数的含义
JavaScript - Meaning of this Higher Order Function
首先,如果我没有在正确的位置发帖或者已经有重复的帖子,我深表歉意,但我不知道如何称呼它或如何搜索它。
谁能给我解释一下下面的代码是什么意思:
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
为什么函数调用后需要有 (Boolean)?
noisy(Boolean)(0);
这种类型的函数调用叫什么?
提前致谢!
"noisy" 是一个函数,如果你调用它,returns 就是一个函数。
通过将 Boolean
传递给函数,Boolean
的调用方式与 Boolean(0)
类似,结果是 false
,因为 0 是一个虚假值。
Boolean
只是一个构造函数,您可以使用它来创建布尔值或将任何值转换为布尔值。
您需要传递一个 f
- 它可以是 Boolean
函数以外的任何东西。尝试
const increment = x => x+1;
const noisyInc = noisy(increment);
console.log(noisyInc(1));
在您的原始代码中,省略了中间变量 - 就像我在这里写 noisy(increment)(1)
一样。
您正在调用一个函数 noisy(...)
,该函数返回另一个函数,该函数是使用其参数中的信息构造的。 函数调用 noisy(Boolean)(0);
实际上是两个函数调用,可以(也许应该)写成:
var noisyFunction = noisy(Boolean)
noisyFunction(0)
事实上 noisy()
接受一个函数(Boolean
是一个函数 MDN)。对此处使用的语法没有实际影响,它可以不带任何参数,或者不那么滑稽的东西。
您对高阶函数标签的选择确实是一种总结。这是使用它们编程的示例。 f
在 noisy
returns 之后对 noisyFunction
可用的事实是闭包 (MDN) 的结果。一些程序员可能会将此描述为 "using a closure",但它并不特定于所示模式。
这是棘手的事情。 (Boolean)
在这里可能会让您失望,但实际上它只是一个常规的旧参数。您可以将 Boolean
替换为任何函数,例如 doStuff
,它仍然有效。
是的,正如您所指出的,这是一个重复的问题。您正在查看名为 "closure." 的内容,这是来自 Whosebug 的绝妙答案:
How do JavaScript closures work?
首先,如果我没有在正确的位置发帖或者已经有重复的帖子,我深表歉意,但我不知道如何称呼它或如何搜索它。
谁能给我解释一下下面的代码是什么意思:
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
为什么函数调用后需要有 (Boolean)?
noisy(Boolean)(0);
这种类型的函数调用叫什么?
提前致谢!
"noisy" 是一个函数,如果你调用它,returns 就是一个函数。
通过将 Boolean
传递给函数,Boolean
的调用方式与 Boolean(0)
类似,结果是 false
,因为 0 是一个虚假值。
Boolean
只是一个构造函数,您可以使用它来创建布尔值或将任何值转换为布尔值。
您需要传递一个 f
- 它可以是 Boolean
函数以外的任何东西。尝试
const increment = x => x+1;
const noisyInc = noisy(increment);
console.log(noisyInc(1));
在您的原始代码中,省略了中间变量 - 就像我在这里写 noisy(increment)(1)
一样。
您正在调用一个函数 noisy(...)
,该函数返回另一个函数,该函数是使用其参数中的信息构造的。 函数调用 noisy(Boolean)(0);
实际上是两个函数调用,可以(也许应该)写成:
var noisyFunction = noisy(Boolean)
noisyFunction(0)
事实上 noisy()
接受一个函数(Boolean
是一个函数 MDN)。对此处使用的语法没有实际影响,它可以不带任何参数,或者不那么滑稽的东西。
您对高阶函数标签的选择确实是一种总结。这是使用它们编程的示例。 f
在 noisy
returns 之后对 noisyFunction
可用的事实是闭包 (MDN) 的结果。一些程序员可能会将此描述为 "using a closure",但它并不特定于所示模式。
这是棘手的事情。 (Boolean)
在这里可能会让您失望,但实际上它只是一个常规的旧参数。您可以将 Boolean
替换为任何函数,例如 doStuff
,它仍然有效。
是的,正如您所指出的,这是一个重复的问题。您正在查看名为 "closure." 的内容,这是来自 Whosebug 的绝妙答案:
How do JavaScript closures work?