为什么这个函数在单独的括号中有第二个参数?

Why does this function have a second parameter in separate brackets?

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

  1. 我不明白为什么第二个参数 (0) 包含在第二对括号中,而不是 Boolean?

  2. 为什么要返回val

让我们破解密码。

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 是一个函数,在调用时 return 是另一个接受单个参数的函数。

所以,在下面的语句中

noisy(Boolean)(0);

Boolean 作为参数传递给 noisy 函数,0 传递给内部函数。

  1. I don't understand why the second parameter (0) is contained in a second pair of brackets, & not with 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)();
    
  2. Why does val have to be returned?

    这完全取决于您。如果你想从函数中得到一些值,你可以 return 值和 catch/assign 它在其他变量中。