Подтвердить что ты не робот

В чем разница между вызовом функции и ссылкой на функцию?

У меня есть следующая функция

function hello() {
 alert("hi!");
}

Возьмите этот кусок кода:

var elem = document.getElementById("btn");
elem.onclick = hello;

Мой вопрос может быть немного трудно понять, так что несите меня: Что ТОЧНО отличает ЭТОТ кусок кода от обычного вызова, или то, что заставляет этот фрагмент кода ссылаться на функциональную переменную, а не на обычный вызов? (hello();)

Как я могу узнать, где я должен давать ссылку на эту функцию, и когда я должен ее называть?

4b9b3361

Ответ 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 = привет, это называется обратным вызовом. Если приветствие не выполняется напрямую, а только при запуске определенного события (в этом случае при щелчке по элементу)