在这种情况下该功能的实现是什么

时间:2018-12-10 15:20:10

标签: javascript function

我们创建了一些函数,用于对两个传递的数字进行所有可能的不同算术运算:

function add(a, b){return a + b}
function mul(a, b){return a * b}

...

现在包装器函数的实现方式是什么,因此包装器函数应该执行第三个参数要求它执行的操作。

function wrapper(a,b,..){
 ? 
}

对于一个实例,如果我打电话给

var test = wrapper(4,5,..)

test的值应基于第三个参数

1 个答案:

答案 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))

请注意,当您将addmul作为参数传递时,没有括号-这是因为如果您执行add(),您将执行函数,您将传递该函数的<结果>结果。对于add(),您将undefinedundefined加在一起,因为没有任何传入,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