【问题标题】:How to return back the function call and its parameters within the same function in JavaScript如何在 JavaScript 中返回同一函数中的函数调用及其参数
【发布时间】:2020-07-08 07:13:11
【问题描述】:

不使用任何已被弃用的东西并且不作为参数传递给函数调用,我们可以返回带有确切参数的整个函数调用吗?

例如,我们有:

function MyFunction(param1, param2, param3) {
    var f = function() {
        MyFunction(param1, param2, param3); // Made an edit here.  This would make more sense.
    }

    return(f); // I really don't want to define f.
}

var capture = MyFunction(1, 2, 3);

capture();

我们可以使用一些关键字或 JavaScript 函数代替对 f 变量的函数调用而不是硬编码,从而不需要维护吗?

【问题讨论】:

  • 您能否详细说明您想要实现的目标?函数本身当然知道哪些参数已传递给它,但我不太确定您的最终目标是什么。
  • 将保存整个函数调用,但仅在函数执行后。保存的函数将在稍后重新调用。
  • 我应该说函数中包含了不错的 promise,所以我们不能在函数调用后立即保存它。
  • 不确定你想要实现什么,但如果你想多次调用同一个函数,可以看看generators
  • 为什么函数必须这样做?为什么来电者不能做出必要的安排?毕竟调用函数的是调用者。

标签: javascript function parameters


【解决方案1】:

为什么不在函数内部返回另一个函数?

function MyFunction(param1, param2, param3) {
    return function() {
        return param1+param2+param3;
    }
}

var capture = MyFunction(1, 2, 3);

capture();

【讨论】:

  • hmmm ..我通过在函数中添加警报进行了测试,它只发出了 1 次警报。我预计会有 2 个警报。
  • 然后在MyFunction里面给出一些执行,当再次返回时执行?
【解决方案2】:

您可以使用generator function 多次调用该函数。

使用Promise.then

async function* func(...props) {
  for (let i = 0; i < props.length; i++) {
    const result = await new Promise((resolve) =>
      setTimeout(() => resolve(props[i]), 1000)
    );

    yield result;
  }
}

let generator = func(1, 2, 3);

generator.next().then((val) => {
  console.log(val);
});

generator.next().then((val) => {
  console.log(val);
});

generator.next().then((val) => {
  console.log(val);
});

使用Async/Await

async function* func(...props) {
  for (let i = 0; i < props.length; i++) {
    const result = await new Promise((resolve) =>
      setTimeout(() => resolve(props[i]), 1000)
    );

    yield result;
  }
}

(async () => {
  let generator = func(1, 2, 3);

  console.log(await generator.next());
  console.log(await generator.next());
  console.log(await generator.next());
})();

【讨论】:

    【解决方案3】:

    这不能完全概括,一个函数可以用它的名字来引用(只有命名的函数)本身,对当前执行的函数没有共同的引用。当你有一个命名函数时,下面的 sn-p 可以满足你的需要,它不是对象的方法。

    function captureFn(fn, args) {
      return function() {
        fn.call(null, ...args);
      };
    }
    
    function MyFunction(param1, param2, param3) {
      console.log(param1, param2, param3);
      return captureFn(MyFunction, arguments);
    }
    
    var capture = MyFunction(1, 2, 3);
    
    capture();

    MyFunction 的返回语句中,您必须将第一个参数更改为每个使用此返回值的函数的函数名称。

    这也很容易扩展到涵盖对象方法。只需将this 作为参数传递给captureFn,并在fn.call 中传递传递的this 而不是null。从对象方法调用时,函数也可以是匿名的,函数名可以替换为对该方法的引用(this.methodName)。请参阅此变体working at jsFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2023-04-04
      • 2013-10-03
      • 2015-11-26
      相关资源
      最近更新 更多