Как куда-нибудь передать функцию // почему событие вызывается сразу же?

213
19 сентября 2017, 09:39

Допустим, я написал функцию:

function foo() {
    alert("Hello, world!");
}

Почему когда я пытаюсь вызвать ее спустя некоторое время, она вместо этого вызывается сразу же?

setTimeout(foo(), 10000);

И то же самое - с обработчиками событий? Пытался делать вот так:

el.onclick = foo();
el.addEventListener("click", foo());
createButton({
    name: "show alert",
    onClick: foo(),
});
Answer 1

Возможно, вы написали скобки около имени функции - foo() - случайно. А возможно, вы думаете что именно этими скобками функция отличается от переменной. В любом случае, ошибка скрыта именно тут.

Кратко: уберите лишние скобки и все заработает.

Javascript вычисляет выражения изнутри-наружу (как и многие другие языки). Очевидные примеры из математики: в выражении 2 + 2 * 2 сначала выполняется умножение, а потом - сложение, а в выражении (2 + 2) * 2 - наоборот.

Когда вы пишите foo() - это оператор вызова функции. Это- такая же часть выражения как и любая математическая операция. И если где-то внутри выражения есть вызов foo() - то функция foo будет вызвана независимо от того что написано снаружи.

Так, в примере setTimeout(foo(), 10000); сначала вызывается foo(), а потом результат вызова foo() (обычно это какой-нибудь undefined) передается в setTimeout: setTimeout(undefined, 10000). С точки зрения интерпретатора Javascript это не ошибка: он же не знает что такое foo, он просто послушно делает что вы ему сказали.

Если вам не нужно вызывать функцию - то не надо ее вызывать. Просто убираем скобки около имени функции - и теперь она передается как есть, без вызова:

setTimeout(foo, 10000);
el.onclick = foo;
el.addEventListener("click", foo);
createButton({
    name: "show alert",
    onClick: foo,
});

Вызовут ее уже в другом месте, когда придет время. (Кстати, такая переданная куда-то функция обычно называется колбеком, callback или функцией обратного вызова).

Если вас волнует вопрос как в таком случае интерпретатор отличит функцию от переменной, то ответ на него - а ему и не нужно их отличать, имя функции - это разновидность имени переменной.

READ ALSO
Как правильно создать объект

Как правильно создать объект

Суть: Пользователь на сайте в форме заполняет данные, примерно такой вид данных на выходе - idUser, date1, date2 (причем он может внести несколько строк,...

204
Неверно работает onclick

Неверно работает onclick

Использую библиотеку higslide, хочу сделать галереюПри клике на изображение оно должно увеличиваться, но скрипт просто открывает изображение...

354
Google map api, как закрасить регион или область?

Google map api, как закрасить регион или область?

Подскажите,предусмотрено ли в google maps api возможность закраски каким-то своим цветом региона(области), скажем я хочу отметить регионы в которых...

239