jQuery — использование анонимной функции, переданной в качестве параметра функции, в качестве функции обратного вызова jQuery

Это лучше всего объясняется на примере кода, поэтому может ли кто-нибудь объяснить, почему (в технических терминах) анонимная функция, переданная в тест, не вызывается после события скрытия jQuery?

ОБНОВЛЕНИЕ: для этого примера не имеет значения, к чему это относится, но для ясности скажем, что тестовая функция находится в глобальной области видимости, и это элемент привязки.

test(this, function() {
    alert('Called by anonymous function!');
});

function test(object, callback) {
    $(object).hide('slow', callback);
}

Изменение:

$(object).hide('slow', callback);

To:

$(object).hide('slow', callback());

работает. Это потому, что обратный вызов не является именованной функцией в текущем контексте или объекте глобального окна?


person Matt    schedule 26.04.2012    source источник
comment
Вам нужно предоставить больше кода, особенно что такое «это». Кроме того, выполнение обработчика вручную является неправильным.   -  person Bergi    schedule 26.04.2012
comment
вам не хватает ) в вашем test() звонке   -  person Joseph    schedule 26.04.2012
comment
На самом деле неважно, что это такое. Но ради аргумента тестовая функция находится в глобальной области видимости, и это относится к элементу привязки. Почему неправильно выполнять обработчик с помощью callback()? Он не будет выполнен, если вы просто передадите ссылку на анонимную функцию в качестве обратного вызова для jQuery .hide().   -  person Matt    schedule 27.04.2012


Ответы (2)


Ваш код должен выглядеть примерно так

test(this, function() {...});

Вы не вызываете анонимную функцию в своем коде, но я не уверен, что на самом деле делает этот синтаксис.

Посмотрите эту скрипку рабочего примера http://jsfiddle.net/L4NxD/2.

Редактировать, внесены дополнительные изменения в скрипку, чтобы лучше дублировать исходный код. Используйте http://jsfiddle.net/L4NxD/1 и просто http://jsfiddle.net/L4NxD/, чтобы получить более ранние версии.

person Thomas Jones    schedule 27.04.2012
comment
Это ничем не отличается от моего кода, за исключением того, что вы заменили его селектором javascript. Это наводит меня на мысль, что в переданном объекте this есть ошибка. Спасибо за демонстрацию. Проблема считается суженной. Проведет несколько тестов, прежде чем принять. - person Matt; 27.04.2012
comment
См. jsfiddle.net/6dFm6 для полного примера кода и jsfiddle.net/6dFm6/1, когда обратный вызов вызывается с помощью callback(). Первое не работает, второе работает. - person Matt; 27.04.2012
comment
Не совсем уверен, почему, но это связано с .remove() в конце. Убери это, и все заработает. jsfiddle.net/6dFm6/4 Я предлагаю обернуть $(this).remove() call внутри обратного вызова, чтобы скрыть его или вообще удалить, если это возможно. - person Thomas Jones; 27.04.2012
comment
Моя теория заключалась в том, что .remove() удалял объект до или во время обратного вызова события, что могло помешать работе обратного вызова, однако я не уверен, как это работает внутри. Также я добавил задержку (5000) между скрытием и удалением, и ничего не изменилось. Есть ли у экспертов по jQuery объяснение? - person Matt; 30.04.2012

Это правильный способ сделать это.

http://jsfiddle.net/6dFm6/6/

Вызов remove после анимации скрытия удалит объект и приведет к тому, что обратный вызов анимации не будет вызван.

Причина, по которой это работает в jsfiddle.net/6dFm6/1, заключается в том, что обратный вызов выполняется во время выполнения, а значение передается и вызывается во время события обратного вызова.

См. эти статьи для получения разной степени ясности о том, что возвращается функцией 'functionName()' в качестве обратного вызова. Похоже, что вызов возвращает «неопределенное», однако выполнение все еще происходит в нужное время.

Когда использовать () после имени функции обратного вызова?

В JavaScript делает какая разница, если я вызову функцию в круглых скобках?

Функция обратного вызова — использование скобок

я нужны круглые скобки при использовании именованной функции в качестве обратного вызова успеха jquery ajax

синтаксис javascript: вызовы функций и использование скобок

person Matt    schedule 11.10.2012