Почему эта функция имеет второй параметр в отдельных скобках?


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
Я понимаю, что высшие функции могут быть функциями, которые изменяют другие функции, как в приведенном выше примере. Я понимаю, почему вторая консоль.log выдает Called with 0 - got false в качестве вывода.
  1. Я не понимаю, почему второй параметр (0) содержится во второй паре скобок, а не с Boolean?

  2. Почему val должен быть возвращен?

1 2

1 ответ:

Давайте взломаем код.

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 передается внутренней функции.

  1. Я не понимаю, почему второй параметр (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)();
    
  2. Почему вал должен быть возвращен?

    Это полностью зависит от вас. Если вы хотите получить некоторое значение из функции, вы можете вернуть значение и поймать/назначить его в другой переменной.