Функцию в 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()
первым аргументом надо передать не конечный результат, а функцию — её вызовут через некоторое время, не сразу. Тут передают внутреннюю функцию. Поэтому скобки всего одни: с одними скобками получаем внутреннюю функцию.