вызывая привязку «функции» через строку против вызова функции - PullRequest
0 голосов
/ 17 ноября 2011

Я работаю над чужим кодом и натолкнулся на что-то загадочное.

Вместо вызова функций код вызывает функции привязки и затем запускает их через строку.

Пример 1:

bind("hello.world", function(){
     console.log("hello world");
});

trigger("hello.world");

Вместо ---

Пример 2:

helloWorld = function(){
    console.log("hello world");
}

helloWorld();

Каковы плюсы и минусы между Примером 1 и Примером 2. Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2011

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

function someEventHandler(){
    if($(this).hasClass('some-class'))
        // do something
}
$('element').bind('eventName.eventNamespace',someEventHandler);

Теперь, если вы просто вызовете эту функцию, такую ​​как:

someEventHandler();

, вы увидите, что она не будет иметь никакого эффекта, потому что она предназначена для выполнения в дом.element context.
Если вы инициируете событие с функцией someEventHandler в качестве обработчика события:

$('element').trigger('eventName.eventNamespace');

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

someEventHandler.call($('element').get(0));

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

someEventHandler.call($('element1').get(0));
someEventHandler.call($('element2').get(0));
someEventHandler.call($('element3').get(0));
// ... and so on

, а с первым методом будет намного проще:

$('element1,element2,element3').bind('eventName.eventNamespace',someEventHandler);
$('element1,element2,element3').trigger('eventName.eventNamespace');

Обратите внимание, что подход уЭто зависит от контекста, в котором вы используете эти функции.Если ваша функция не имеет никакого отношения к элементу dom или вы не хотите, чтобы больше объектов подписывалось на ваше событие, вам, вероятно, следует сделать его простым и использовать классические объявления функций и вызовы.

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