JavaScript回调功能以及如何使用它们中的替代方案



我知道堆栈溢出中的方向是问您想要什么,并且不证明您希望它如何完成,但是我真的不知道如何以更好的方式询问它而且我不是JavaScript专家...所以...让我们走!

让我们想象我们具有以下JavaScript功能,其各自输出...

function func_a(param_a, param_b, param_c) {
    alert(param_a);
    alert(param_b);
    alert(param_c);
}
function func_b(func_to_run) {
    // Will call "func_a" HERE!
    func_to_run("a", "b", "c");
}
func_b(func_a);
// a
// b
// c

我的问题是:

有一种正确和/或更好的方法将参数传递到函数" func_a"当我们将其作为函数的论点" func_b"?

我如何将参数传递到函数" func_a&quot"在功能中" func_b"称呼?下面我会给您一个假设示例...

function func_a(param_a, param_b, param_c) {
    alert(param_a);
    alert(param_b);
    alert(param_c);
}
function func_b(func_to_run) {
    func_b_param = "z";
    // Will call "func_a" HERE!
    func_to_run(value_from_func_b_call, value_from_func_b_call, func_b_param);
}
// Third parameter deliberately empty!
func_b(func_a("a", "b", ));
// a
// b
// z

我不知道我是否清楚地解释了!如果有任何疑问或改进的建议,请告诉我!

这是您要寻找的吗?

function func_a(param_a, param_b, param_c) {
    alert(param_a);
    alert(param_b);
    alert(param_c);
}
function func_b(func_to_run, a, b) {
    func_b_param = "z";
    // Will call "func_a" HERE!
    func_to_run(a, b, func_b_param);
}

func_b(func_a, a, b);

您可以将参数传递给func_b:

function func_a(param_a, param_b, param_c) {
    alert(param_a);
    alert(param_b);
    alert(param_c);
}
function func_b(func_to_run, param1, param2) {
    func_b_param = "z";
    // Will call "func_a" HERE!
    func_to_run(param1, param2, func_b_param);
}
// Third parameter deliberately empty!
func_b(func_a, "a", "b");

尽管这是一个快速而肮脏的答案,但是如果我们对您要实现的目标有更好的了解,可能会有更好的答案。特别是使用新的ES6语法和传播操作员。

我如何将参数传递到函数中的函数" func_a" " func_b"呼叫?

如果正确解释问题,则可以将对象传递给func_b作为参数,其中属性设置为1(要调用的函数;2(参数作为传递的数组来函数;3(在传递的函数中呼叫的功能。

您可以使用Reflect.apply()调用外部函数以调用,可选地在外部功能中设置this;通过和数组,第一个元素是要调用的内部函数,例如func_b,第二个元素是要在以前为spread元素的函数的参数。

在外部函数的第一个参数处,以定义代表要调用的内部函数的参数;在第二个参数处定义ret REST参数func_a代表传递给内部函数的参数称为。

function func_a(fn, ...args) {
  for (let arg of args) fn(arg)
}
function func_b(func_to_run) {
  // Will call "func_a" HERE!
  Reflect.apply(func_to_run.fn, null, [func_to_run.innerFn, ...func_to_run.args]);
}
func_b({
  fn: func_a,
  innerFn: alert,
  args: ["a", "b", "c"]
});

最新更新