2012-05-25 2 views
2

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

function mycallback(){ 
    //dosomething 
} 

function mainfunc(mycallback){ 
    //do something else 
    mycallback(); 
} 

mainfunc(mycallback); 

Который работает, как и следовало ожидать, большой. Мой вопрос в том, что вопрос о возврате функции обратного вызова в качестве аргумента в mainfunc? Кажется, что если вы опускаете это:

function mycallback(){ 
    //dosomething 
} 

function mainfunc(){ 
    //do something else 
    mycallback(); 
} 

mainfunc(); 

он отлично работает и идентичен первому примеру. Но я не вижу людей, использующих обратные вызовы таким образом. Есть ли причина? Что мне не хватает?

+0

Ваш второй пример работает, потому что 'mycallback' существует в (одной) внешней области вашего« mainfunc ». Обычно это не так. Распространенная картина заключается в использовании анонимных функций обратного вызова. –

+0

Должно ли 'mainfunc' всегда вызывать одну и ту же функцию' mycallback', или есть несколько функций обратного вызова? –

ответ

1

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

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

1

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

mainfunc(eatSevenBurritos); 
mainfunc(eatTwoChimichangas); 

При определенных условиях, возможно, вы предпочтете поесть 7 бурритосов, проходя через mainfunc. Возможно, в каком-то другом состоянии вы предпочитаете есть 2 chimichangas, проходя через mainfunc.

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

Когда люди говорят о «функциях первого класса», такое поведение является тем, что они означают. Возможность рассматривать функции как параметр. Потому что поведение - это тип данных.

2

Обратные вызовы лучше всего использовать, когда у вас есть асинхронные задачи.

Скажем, mainfunc - операция асинхронного действия.

  • В вашем первом примере вы передали определенный ответный вызов mainfunc. Это дает вам гибкость для звонящего, чтобы назначить, какую функцию выполнить после операции.

  • Второй пример: вы hardcoded обратный вызов. Если у вас нет причин для этого, как и предопределенная функция пост-обработки, это не является гибким.

+0

Это хороший момент. –

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