我们创建了一些函数,用于对两个传递的数字进行所有可能的不同算术运算:
function add(a, b){return a + b}
function mul(a, b){return a * b}
...
现在包装器函数的实现方式是什么,因此包装器函数应该执行第三个参数要求它执行的操作。
function wrapper(a,b,..){
?
}
对于一个实例,如果我打电话给
var test = wrapper(4,5,..)
test
的值应基于第三个参数
答案 0 :(得分:3)
您可以传入函数引用作为第三个参数,并使用前两个参数将其用于计算结果:
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