@fendrarog
Учу программирование.

Почему у функции в setInterval «пишем» одни скобки а не две вызывая ее при замыкании?

Почему у функции в setInterval "пишем" одни скобки а не две при замыкании? А если написать две, то сетИнтервал не будет работать, и функция будет работать только по событию.
elem.addEventListener("click", function () {
  setInterval(
    ((param) => () => {
      console.log("Выхлоп!" + param);
    })(6),
    1000
  );
});


Но без setInterval функция не выполнит свою задачу без вторых скобок
((param) => () => {
  console.log("Выхлоп!" + param);
})(6)();


Почему так происходит?
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Потому, что в setInterval() первым аргументом надо передать функцию (он сам вызовет её потом),
а «без setInterval» — для получения результата надо эту же функцию ещё и вызвать самим.

длинный ответ
Функцию в 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() первым аргументом надо передать не конечный результат, а функцию — её вызовут через некоторое время, не сразу. Тут передают внутреннюю функцию. Поэтому скобки всего одни: с одними скобками получаем внутреннюю функцию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
imko
@imko
Senior Scratch Developer
Потому что в первом случае ты вызываешь оператор setInterval который ну простым языком запускает что-то по таймауту, и запускает он функцию в него переданную. А во втором случае без скобок это просто объявление функции стрелочной, дополнительные скобки это ее вызов. Такая хитрая конструкция вызова при объявлении. То же самое что и
function foo(param) {
	function bar() {
		console.log("Выхлоп!" + param)
	}
	return bar
}
foo(123)()


зачем тут стрелка возвращает стрелку я хз)
можно сделать просто вот так
function foo(param) {
	console.log("Выхлоп!" + param)
}
foo(123)
Ответ написан
Комментировать
@rPman
потму что ты определил вложенные замыкания (не думал что такое синтаксически возможно)
(param) => () => {
вот пример
var x = (param) => () => {  console.log("Выхлоп!" + param);}
x();
// > function x()
x(1)();
// Выхлоп!1

var x = (param) => {  console.log("Выхлоп!" + param);}
x(1);
// Выхлоп!1


лично мне интересно почему надо писать x(1)() а не x()(1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы