Там в ответ принят, но я не думаю, что это объясняется очень хорошо, и решение добавляет ненужные дополнения, так что вот еще немного информации.
Параметр callback
должен быть function pointer
. Это не термин, который используется очень часто в наши дни, но это означает, что вы передаете функцию непосредственно, а не результат функции.
Что это значит?
Учитывая пример:
function message(q) {
alert(q);
}
Здесь message
функция. Чтобы передать эту функцию в качестве callback
, используйте имя функции, например:
setTimeout (message, 100); $ ("# id"). Click (message);
Обратите внимание, что нет ()
после имени функции.
В javascript терминах сама функция является переменной, и вы передаете переменную, но как только вы добавляете ()
, вы вызываете функцию и передаете результат, а не сама функция.
Если вы используете message()
, то функция будет выполнена и результат функции переданного в качестве callback
, а именно:
setTimeout(message("x"), 100);
является эквивалентом:
var x = message("x");
setTimeout(x, 100);
Так вы может видеть из этого кода, почему сообщение запускается немедленно (более очевидно с событием клика или более длинным таймаутом).
Формат setTimeout(message, 100);
не используется очень часто, так как он выглядит как опечатка (должен быть message()
?) И b) он не позволяет вам передавать параметр, поэтому это часто записывается как:
setTimeout(function() { message("x") }, 100);
который использует анонимные в линии функции как/указатель функции callback
переменных.
Назад вопрос:
В вашем original fiddle, все, что вам нужно сделать, это изменить callback
к истинному callback
без необходимости добавления отдельного параметра, а именно:
$('#scroll').on('click', function(e) {
e.preventDefault;
scrollToTop(function() { message("Reached Top")});
});
Обновлена скрипка: http://jsfiddle.net/5zu90ygz/9/
Спасибо. Я знал, что есть некоторые проблемы с другим решением. Были вещи, которые были изменены без причины, и упоминания о проблемах, которые не были проблемой вообще. Я поражен тем, что у меня так много аплодисментов, чтобы быть честным (хотя в конце концов он оказался в достаточно хорошем состоянии). Ваше объяснение идеально и очень полезно. –