我一直在读一本关于JavaScript的书,即雄辩的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);
// → calling with 0
// → called with 0 - got false
什么类型的参数是布尔值,一个接一个地传递两个参数对JavaScript有什么影响。如果有人能解释一下这是怎么回事,我会很感激的。
布尔值是一个内置函数/构造函数,参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean。
f(x)(y)
表示:调用f
,传递x
作为参数。然后接受返回值(必须是另一个函数),并调用它,传递y
作为参数。它像var tmp = f(x); tmp(y);
一样工作。
noisy(Boolean)
返回
function(arg) {
console.log("calling with", arg);
var val = f(arg);
console.log("called with", arg, "- got", val);
return val;
};
其中f
绑定到Boolean
。
然后用0
调用该函数执行
console.log("calling with", arg);
var val = f(arg);
console.log("called with", arg, "- got", val);
return val;
其中f = Boolean
和arg = 0
,即
console.log("calling with", 0);
var val = Boolean(0);
console.log("called with", 0, "- got", val);
return val;
我认为你的问题是:
-
Boolean
是一个函数—它是布尔原语的对象包装器类型的标准构造函数; -
noisy()
是一个接受一个函数作为参数并返回另一个函数的函数; - …因此,调用
noisy(Boolean)
将产生一个函数,因此该函数可以带另一个带括号的参数列表调用。
noisy(Boolean)(0)
调用noisy()
函数,然后调用返回的函数。返回的函数记录消息(我猜这就是为什么它被称为"嘈杂")并显示原始传递的函数(Boolean
)的功能。
Boolean
是一个javascript基本类型构造函数
noisy(Boolean)
将返回以下函数
function(arg) {
console.log("calling with", arg);
var val = Boolean(arg); // <- see the Boolean here
console.log("called with", arg, "- got", val);
return val;
}
所以noisy(Boolean)(0);
将执行上面的函数传递0作为参数9arg)