Stasgar
@Stasgar
Обученная макака

Зачем нужны callback функции?

Чем:
var allUserData = [];


function logStuff(userData) { 
    if (typeof userData === 'string') { 
        console.log(userData); 
    } else if (typeof userData === 'object') { 
        for (var item in userData) { 
            console.log(item + ': ' + userData[item]); 
        }
    }
}

function getInput(options) { 
    allUserData.push(options);
    logStuff(options);
}

getInput({ name: 'Rich', speciality: 'JavaScript' });


Отличается от:
var allUserData = [];

function logStuff(userData) { 
    if (typeof userData === 'string') { 
        console.log(userData); 
    } else if (typeof userData === ‘object’) { 
        for (var item in userData) { 
            console.log(item + ‘: ‘ + userData[item]); 
        }
    }
}

function getInput(options, callback) { 
    allUserData.push(options);
    callback(options);
}

getInput({ name: 'Rich', speciality: 'JavaScript' }, logStuff);


И собственно зачем этот callback нужен вообще, если без него пишется кода меньше? Я только вникаю, так что тапками не закидывайте ;(
  • Вопрос задан
  • 5595 просмотров
Решения вопроса 3
Тем, что ты можешь много разных getInput использовать и при этом использовать разные функции для обработки, указанные вторым аргументом. А, используя первый вариант, одна функция logstuff привязана функции к getInput, и если что-то понадобится изменить, то функцию getInput придётся адаптировать под изменившиеся условия.
Ответ написан
alsopub
@alsopub
В данном случае - разницы никакой.
Если нужно будет устанавливать разные обработчики для данных - появится преимущество.
То есть если будут вызовы:
getInput({ name: 'Rich', speciality: 'JavaScript' }, logStuff);
getInput({ name: 'Rich', speciality: 'JavaScript' }, logOther);
getInput({ name: 'Rich', speciality: 'JavaScript' }, logToDisk);

Имхо в данном случае это не совсем callback, это просто передача функции обработки как аргумента.
Callback, это когда вы вызываете какой-то метод, который когда-нибудь (через несколько секунд например) должен вызывать вашу функцию с результатом.
Ответ написан
DeeplessHole
@DeeplessHole
Студент матмеха СпбГУ
Ну смотри, в варианте с коллбэком у тебя может быть несколько функций, которые по-разному выводят логи, которые в зависимости от ситуации можешь передавать параметром в `getInput`. Без них пришлось бы все варианты вывода прописывать в одной функции и выбирать свитчем или иф-элзами.

Сразу вспомнился пример с компаратором: у тебя написана функция сортировки, которая для сравнения использует коллбэк(наш компаратор), и можно менять направление сортировки(по возрастанию, по убыванию).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы