Почему синтаксис func1 (func2) (параметры);работа и как она называется? - PullRequest
1 голос
/ 04 ноября 2019

Из книги Eloquent Javascript Third Edition, глава 5. Кажется, я не могу найти эту конструкцию 'f () ()' в своем исследовании, и я хотел бы узнать больше об этом.

Iожидается, что он сможет использовать

noisy(Math.min(3, 2, 1)); 

, но при этом ничего не выводится. Тем не менее, пример книги работает как задумано. Но как?

Пример книги:

function noisy(f) {
  return (...args) => {
    console.log('calling with', args);
    let result = f(...args);
    console.log('called with', args + ', returned', result);
    return result;
  };
}    
noisy(Math.min)(3, 2, 1);

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

f()() вызывает функцию с именем f, которая, предположительно, возвращает функцию, а затем окончательный () вызывает эту функцию. Например,

const f = () => {
  console.log('first invoke');
  return () => console.log('second invoke');
};

const returnedFn = f();
console.log('----');
returnedFn();

f()() аналогичен приведенному выше, за исключением того, что он не хранит returnedFn в переменной - скорее он просто выполняет returnedFn немедленно.

Это то же самое, что делает noisy - он возвращает функцию, поэтому, если вы хотите немедленно вызвать возвращенную функцию, нигде не сохраняя возвращаемую функцию, поместите еще один () после вызова noisy.

Проблема с

noisy(Math.min(3, 2, 1))

заключается в том, что он немедленно вызывает Math.min - интерпретатор упрощает это до

noisy(1)

перед вызовом noisy, поэтому noisy не видит ничего о Math.min или аргументах, с которыми он был вызван. (Но весь смысл функции noisy состоит в том, чтобы регистрировать как вход, так и выход функции)

1 голос
/ 04 ноября 2019

noisy() принимает функцию в качестве аргумента (это видно по строке let result = f(...args);). Math.min(3, 2, 1) разрешает значение, а не функцию, поэтому оно не работает, когда передается в noisy().

Все, что f()() означает, что функция f возвращает функцию, котораясам тогда исполняется. Это может быть легче понять, если мы разобьем это так:

let g = f();
let result = g();
0 голосов
/ 04 ноября 2019

noisy принимает функцию в качестве аргумента, а также возвращает ее. Всякий раз, когда вы пытаетесь noisy(Math.min(3, 2, 1));, вы передаете результат Math.min(3, 2, 1) шуму, который аналогичен вызову noisy(1).

. Вы также можете разделить запутанную инструкцию на две:

let noisyMin = noisy(Math.min);
noisyMin(3, 2, 1);

По сути, вы просто получаете функцию в результате noisy(Math.min), а затем вызываете ее сразу.

f()() возможно, только если f() возвращает функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...