2011-11-17 8 views
0

Я работаю над чужим кодом и натолкнулся на что-то озадачивающее.запуск функции «функции» через строку и вызов функции

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

Пример 1:

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

trigger("hello.world"); 

Вместо ---

Пример 2:

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

helloWorld(); 

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

+0

Знание контекста поможет, прямо сейчас пример два на самом деле недействителен. –

ответ

0

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

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

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

someEventHandler(); 

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

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

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

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

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

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, или вы не хотите, чтобы дополнительные объекты добавляли к вашему мероприятию, напишите, вы, вероятно, должны просто хранить его и использовать классические декларации функций и вызовы.

+0

Благодарим вас за четкое объяснение. – Ruby

Смежные вопросы