Функцию в JavaScript можно «положить в переменную», передать как аргумент при вызове другой функции или получить как результат вызова ещё одной функции. Так же как
"строку" или число
42.
В этом выражении, смотрите, есть не 1, а целых 2 стрелочки:
(param) => () => {
console.log("Выхлоп!" + param);
}
Две стрелочки, значит, тут две функции. Одна вокруг второй. Первая, та, что снаружи, принимает аргументом
param, и возвращает вторую функцию
() => { console.log("Выхлоп!" + param); } Причём вернувшаяся функция «запомнила» значение
param внешней обёртки и будет его использовать. Это обёртывание называется «
Замыкание» или "closure".
Теперь скобки при вызове. У нас матрёшка из двух функций:
function(){ return function() {}; }
Чтобы вызвать внешнюю, нужны
первые скобки:
((param) => () => console.log(param))(6) – этот вызов внешней с аргументом
6 даст результатом внутреннюю функцию, которая запомнила значение
param. И мы имеем на руках внутреннюю функцию.
Чтобы вызвать внутреннюю, нужны
вторые скобки:
((param) => () => console.log(param))(6)()
Итого, две функции — два вызова — две пары скобок.
В
setInterval() первым аргументом надо передать не конечный результат, а функцию — её вызовут через некоторое время, не сразу. Тут передают внутреннюю функцию. Поэтому скобки всего одни: с одними скобками получаем внутреннюю функцию.