2013-04-08 4 views
17

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

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

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

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

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

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

+0

Я могу ошибаться, новое для этих динамических языков (только начал смотреть на Python) , но я думаю, что ссылка - это когда вы хотите создать псевдоним для указанной функции, а вызов - буквально, когда вы хотите позвонить. (EG. 'Var = hello', тогда' var() 'совпадает с вызовом' hello() 'везде, где вызывается var()' – SGM1

ответ

23

Ну, свойство onclick ожидает ссылки на функцию, чтобы она выполнялась при щелчке элемента. Обычно это либо:

element.onclick = funcRef; 

или

element.onclick = function() { 
    funcRef(); 
}; 

(но, конечно, это лучше всего использовать addEventListener и attachEvent)

Обратите внимание, как оба они являются ссылки на функции, не звонит.

Когда что-то ожидает ссылки, вы не называете это ... вы назначаете ссылку на него (первый пример).

Если вы хотите специально вызвать функцию, вы вызываете ее с помощью () (второй пример). Но обратите внимание, как во втором примере все еще есть ссылка на функцию, назначенную для onclick - это просто анонимная функция.

Вероятно, более важная часть:

Некоторые люди думают, что вы хотите сделать это:

element.onclick = funcRef(); 

Но сразу же выполняет функцию (из-за ()), и присваивает возвращаемое значение до onclick. Если возвращаемое значение не является функцией, это не то, что вы хотите.

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

+3

** бит ** немедленного выполнения ** очень важен. – Wex

+0

@Wex Haha yeah , Я, казалось, подорвал его. Попытка подумать о том, как расширить его больше – Ian

+0

Есть интересный угловой случай: 'element.onclick = getClickHandler()' –

11

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

Вам нужна функция для запуска сейчас?

чем добавить(), чтобы выполнить его

вы должны работать, чтобы ссылаться, так это называется позже делать?

Не добавляйте().

1

Требуется ссылка на вашу функцию где-то независимо от того, как это называется. Разница здесь в том, что вы явно не вызываете функцию hello. Вы назначаете ссылку на эту функцию на обработчик событий onclick , так что при запуске onclick для этого узла вызывается функция.

1

hello() означает, что вы вызываете эту функцию, что означает, что функция будет выполняться напрямую.

а когда у вас есть elem.onclick = привет, это называется обратным вызовом. Если приветствие не выполняется напрямую, а только при запуске определенного события (в этом случае, когда есть щелчок по элементу)

15

Вы хотите, чтобы он выполнял СЕЙЧАС? Затем назовите его.

a=hello() означает «Позвоните по номеру hello() как можно скорее, и установите его возвращаемое значение в a».

С другой стороны, a=hello означает «a является псевдонимом для hello. Если вы звоните a(), вы получите тот же результат, как вызов hello()»

Вы можете использовать последний для обратных вызовов и т.д., где вы хотите сообщите обозревателю, что вы хотите, чтобы произойти после возникновения события. Например, вы можете сказать «звонок hello(), когда пользователь нажимает» (как в примере). Или: «Когда запрос AJAX возвращает результат, вызовите функцию callback() для возвращаемых данных».

2

Практически все утверждения в JavaScript имеют возвращаемое значение. Если не указано иное, функции в JavaScript возвращают undefined при вызове. Таким образом, единственный контекст, в котором она будет иметь смысл для вызова функции в этом операторе присваивания, если бы вернуть функцию:

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

elem.onclick = hello(); 
Смежные вопросы