Почему эта функция имеет второй параметр в отдельных скобках?
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
в качестве вывода.
-
Я не понимаю, почему второй параметр
(0)
содержится во второй паре скобок, а не сBoolean
? -
Почему
val
должен быть возвращен?
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
передается внутренней функции.
Я не понимаю, почему второй параметр
(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)();
Почему вал должен быть возвращен?
Это полностью зависит от вас. Если вы хотите получить некоторое значение из функции, вы можете вернуть значение и поймать/назначить его в другой переменной.