Как выполняется обратный вызов с аргументами?

Я познакомился с jQuery несколько дней назад и начинаю осознавать, какую маленькую магию он может сделать.

Мне любопытно узнать, как именно в jQuery выполняется обратный вызов с аргументами, т.е. какова точная последовательность выполнения?

Я прошел по ссылке http://docs.jquery.com/Tutorials:How_jQuery_Works

и это говорит о неправильном пути, т.е.

$.get('myhtmlpage.html', myCallBack(param1, param2));

и правильный путь, т.е.

$.get('myhtmlpage.html', function(){
  myCallBack(param1, param2);
});

В первом случае сначала выполняется myCallBack, а затем его возвращаемое значение будет выступать в качестве аргумента для получения. В последнем методе get возвращает веб-страницу, которая будет обрабатываться myCallBack.

Как это работает так синтаксически, что оба имеют myCallBack как еще один аргумент для получения? Я немного запутался в этом.

ура

3 ответа

Решение

Это действительно довольно расплывчатый пример. Вы должны написать:

$.get('myhtmlpage.html', function(param1, param2){
  myCallBack(param1, param2);
});

Это потому, что внутренне jQuery делает что-то вроде этого (очень упрощенно):

$.get = function(url, callback){
  //make call to url
  //when completed execute callback:
  callback(param1, param2);
}

Вы также можете написать:

$.get('myhtmlpage.html', myCallBack);

Это также вызовет myCallBack с двумя параметрами.

В первую очередь, myCallBack(param1, param2) оценивается и исполняется немедленно. В этом синтаксисе он будет вызываться раньше $.get() называется.

Во втором случае определяется безымянная анонимная функция, которая включает myCallBack() для последующего использования. Хранится в качестве параметра для $.get() и будет уволен ТОЛЬКО ПОСЛЕ $.get() называется.

Для получения дополнительной информации об обратных вызовах см. Обратный вызов (информатика) в Википедии.

Если вы используете этот синтаксис:

myCallBack(param1, param2) 

Что вы делаете, это вызываете функцию и получаете результат, как и в любой другой раз, когда вы вызываете функцию.

Если вы используете этот синтаксис:

myCallBack

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

Третий способ:

function(){myCallBack(param1, param2);}

Создает новую безымянную функцию, которая состоит из вызова myCallBack. Это может быть передано в вызов функции или назначено переменной.

Кроме того, вы должны быть осторожны, используя этот синтаксис так же, как в примере, потому что в этом случае param1 и param2 не связаны анонимной функцией и будут либо пустыми, либо заполнены значениями из содержащей области.

Другие вопросы по тегам