Почему вызов функции в jQuery должен быть заключен в метод? - PullRequest
3 голосов
/ 26 июня 2011

Допустим, у меня есть функция:

function myFunction() {
 ...
}

Я хочу вызвать ее из обработчика событий.Почему эта конструкция не вызывает мою функцию?

$(window).resize(myFunction());

Но в этом и заключается хитрость:

$(window).resize(function(){myFunction()});

В чем разница между этими типами вызовов?

1 Ответ

11 голосов
/ 26 июня 2011
$(window).resize(myFunction());

немедленно вызывает myFunction и передает возвращаемое значение в resize. Добавление скобок после имени функции / ссылки вызывает функцию.

С другой стороны,

$(window).resize(function(){myFunction()});

передает анонимную функцию в resize. myFunction вызывается только тогда, когда вызывается внешняя функция.

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

var handler = function(){myFunction()}; // take out the function definition
$(window).resize(handler);  // and replace it with the new name

Теперь вы можете видеть, что после имени функции нет скобок, что означает, что handler не вызывается, передается только ссылка.

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

$(window).resize(myFunction);

Но оба способа имеют свои варианты использования.

Первый пример $(window).resize(myFunction()); все еще может быть полезен, если myFunction возвращает функцию , которая должна использоваться в качестве обработчика события:

function myFunction() {
    var handler = function() {};
    return handler;
}

Возможно, перенастроенный обработчик зависит от параметра, переданного в myFunction.

Передача анонимной функции необходима, если вы хотите вызвать myFunction с некоторыми конкретными аргументами:

function myFunction(a, b) {
    alert(a + b);
}

$(window).resize(function(){
    myFunction(40, 2);
});

Обновление:

@T.J. Crowder сделал важный комментарий об объекте event . Каждый обработчик события получает объект события, переданный в качестве первого параметра. Если бы вы определили свою функцию как

function myFunction(event) {
 ...
}

чтобы иметь (более легкий) доступ к нему, используя анонимную функцию, вам нужно будет передать его через:

$(window).resize(function(event){myFunction(event)});

, если вы хотите его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...