В чем разница между вызовом функции и ссылкой на функцию?
У меня есть следующая функция
function hello() {
alert("hi!");
}
Возьмите этот кусок кода:
var elem = document.getElementById("btn");
elem.onclick = hello;
Мой вопрос может быть немного трудно понять, так что несите меня:
Что ТОЧНО отличает ЭТОТ кусок кода от обычного вызова, или то, что заставляет этот фрагмент кода ссылаться на функциональную переменную, а не на обычный вызов? (hello();
)
Как я могу узнать, где я должен давать ссылку на эту функцию, и когда я должен ее называть?
Ответы
Ответ 1
Ну, свойство onclick
ожидает ссылки на функцию, чтобы она выполнялась при щелчке элемента. Обычно это либо:
element.onclick = funcRef;
или
element.onclick = function () {
funcRef();
};
(но, конечно, лучше использовать addEventListener
и attachEvent
)
Обратите внимание, как обе они являются ссылками на функции, а не на вызов.
Когда что-то ожидает ссылку, вы не называете ее... вы назначаете ссылку на нее (первый пример).
Если вы хотите специально вызвать функцию, вы вызываете ее с помощью ()
(второй пример). Но обратите внимание, как во втором примере все еще есть ссылка на функцию, назначаемую onclick
- это просто анонимная функция.
Вероятно, более важная часть:
Некоторые люди думают, что вы хотите это сделать:
element.onclick = funcRef();
Но это немедленно выполняет функцию (из-за ()
) и присваивает ее возвращаемое значение onclick
. Если значение не является, это не то, что вы хотите.
Я думаю, что мораль этой истории заключается в том, что когда вам нужно/нужно что-то выполнить прямо сейчас, вы вызываете эту функцию. Если функция нужна для последующего использования или нуждается в сохранении, вы ее не называете.
Ответ 2
Вы хотите, чтобы он выполнял СЕЙЧАС? Затем назовите его.
a=hello()
означает "Вызвать hello()
ASAP и установить его возвращаемое значение на a
".
С другой стороны, a=hello
означает, что "a
является псевдонимом для hello
. Если вы вызываете a()
, вы получаете те же результаты, что и вызов hello()
"
Вы используете последний для обратных вызовов и т.д., где вы хотите сообщить браузеру, что вы хотите, после возникновения события. Например, вы можете сказать "call hello()
, когда пользователь нажимает" (как в примере). Или: "Когда запрос AJAX возвращает результат, вызовите функцию callback()
для возвращаемых данных".
Ответ 3
Как я могу узнать, где я должен давать ссылку на эту функцию, и когда я должен ее называть?
Вам нужна функция для запуска сейчас?
Затем добавьте() для его выполнения
Нужно ли функционировать для ссылки, чтобы он был вызван позже?
Не добавляйте().
Ответ 4
Практически все утверждения в JavaScript имеют возвращаемое значение. Если не указано иное, функции JavaScript возвращают undefined
при вызове. Итак, единственный контекст, в котором было бы целесообразно вызвать вашу функцию в этом задании присваивания, если бы он возвращал функцию:
function hello() {
return function() {
alert("hi!");
}
}
elem.onclick = hello();
Ответ 5
Ссылка на вашу функцию нужна где-то независимо от того, как она вызвана. Разница здесь в том, что вы явно не вызываете функцию hello
. Вы назначаете ссылку на эту функцию на обработчик событий elem
DOM node onclick
, так что, когда onclick
запускается для этого Node, ваша функция вызывается.
Ответ 6
hello() означает, что вы вызываете эту функцию, что означает, что функция будет выполняться напрямую.
когда у вас есть elem.onclick = привет, это называется обратным вызовом. Если приветствие не выполняется напрямую, а только при запуске определенного события (в этом случае при щелчке по элементу)