Вы можете передать ссылку на функцию в качестве третьего аргумента и использовать его для вычисления результата, используя первые два аргумента:
function add(a, b){return a + b}
function mul(a, b){return a * b}
function wrapper(a, b, callback){
return callback(a, b);
}
console.log(wrapper(4, 5, add))
console.log(wrapper(4, 5, mul))
Обратите внимание, что нет скобок, когда вы передаете add
или mul
в качестве аргумента - это потому, что если вы сделаете add()
, вы бы выполните функцию, и вы передадите результат этой функции.В случае add()
вы бы сложили вместе undefined
и undefined
, поскольку ничего не передается, wrapper(4, 5, add())
фактически приводит к wrapper(4, 5, NaN)
Альтернативой является использование идентификаторов для операций.Это может быть полезно, если вы не можете напрямую передать функцию, а вместо этого передать данные как действие - например, пользователь нажимает кнопку на одном компьютере, и вы отправляете инструкцию на другой компьютер для обработки.Кроме того, вы можете сохранить действие в базе данных, в файле cookie или в любом хранилище и повторно воспроизвести его позднее.Вы не пропустите всю логику, а только намеченное действие, и вы можете посмотреть его потом.Вот пример того, как это может работать:
//mapping of action name to logic that will be executed
var actionLookupTable = {
"addition": add,
"multiplication": mul
}
function defaultAction() { /* a no-op */}
function add(a, b){return a + b}
function mul(a, b){return a * b}
function wrapper(a, b, actionName){
//fetch the logic to execute for the action.
//If the action name is not recognised, use a default one otherwise you will get an error
var logic = actionLookupTable[actionName] || defaultAction;
return logic(a, b);
}
console.log(wrapper(4, 5, "addition"));
console.log(wrapper(4, 5, "multiplication"));
console.log(wrapper(4, 5, "division")); //no implementation but no error is raised