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
据我所知,更高的功能可以是改变其他功能的功能,如上例所示。我理解为什么第二个console.log会给出Called with 0 - got false
作为它的输出。
我不明白为什么第二个参数(0)
包含在第二对括号中,&不是Boolean
?
为什么必须返回val
?
答案 0 :(得分:4)
让我们打破代码。
function noisy(f) {
return function (arg) {
console.log("Calling with", arg);
var val = f(arg);
console.log("Called with", arg, "- got", val);
return val;
};
}
var fn = noisy(Boolean); // fn now is the inner function
var value = fn(0); // Calling the inner function
如代码所示,noisy
是一个函数,它在调用时返回另一个接受单个参数的函数。
所以,在下面的陈述中
noisy(Boolean)(0);
Boolean
作为参数传递给noisy
函数,0
传递给内部函数。
我不明白为什么第二个参数
(0)
包含在第二对括号中,&不是Boolean
?
你可以,但为此,有些事情需要改变。这使用了闭包的概念,其中内部函数可以访问外部函数的参数。
// Pass two arguments to `noisy()`
function noisy(f, arg) {
return function () {
// Arguments can still be accessed here
console.log("Calling with", arg);
var val = f(arg);
console.log("Called with", arg, "- got", val);
return val;
};
}
// To call, the second braces need to be used
var val = noisy(Boolean, 0)();
为什么必须退回val?
这完全取决于你。如果你想从函数中获取一些值,你可以返回值,并在其他变量中 catch / assign 。