【问题标题】:I can't seem to get my arguments to pass into a callback我似乎无法让我的论点传递给回调
【发布时间】:2018-12-27 02:28:49
【问题描述】:

我创建了一个有效的递归 for 循环,但它仅在我的回调没有参数时才有效。我试过callback(arguments)callback(...arguments)

感谢您提供的任何帮助!

function loopFunc (numOfSteps, callback) {
    let i = 0;

    if (i >= numOfSteps) {
        let i = 0
        return
    } 
    callback()
    loopFunc(numOfSteps - 1, callback)`enter code here`
}

如果回调不带参数,它会起作用:

function noArgsHello() {
    console.log('hello')
}

const thisWorks = loopFunc(3, noArgsHello);
thisWorks()

如果回调带参数就不行:

function sayHello (input) {
    console.log(input)
}

const thisDoesntWork = loopFunc(3, sayHello('hello');
thisDoesntWork()

【问题讨论】:

  • callback 应该是function 对象,而不是function 执行结果(如果结果不是函数对象)。 const thisDoesntWork = loopFunc(3, function(){sayHello('hello');}); thisDoesntWork();应该工作。

标签: javascript callback arguments


【解决方案1】:

这样:

const thisDoesntWork = loopFunc(3, sayHello('hello');

您不再传递回调,而是执行sayHello 函数并将该函数的返回值传递给loopFunc

在这些情况下,您可以做的是使用bind method of functions 来传递带参数的函数:

const thisDoesntWork = loopFunc(3, sayHello.bind(sayHello, 'hello'));

或者你可以直接传递一个执行你的sayHello的函数,这样参数仍然是一个函数,它将在你的loopFunc中用作回调:

const thisDoesntWork = loopFunc(3, () => sayHello('hello'));

【讨论】:

  • 谢谢!这是一个重要的区别。我没有意识到 sayHello('hello') 只是一个返回值。
【解决方案2】:

你快到了!这取决于您的目标是什么,您可以使用任一选项:

function loopFunc (numOfSteps, callback) {
let i = 0;

  if (i >= numOfSteps) {
      let i = 0
      return
  }

 callback(numOfSteps)
 loopFunc(numOfSteps - 1, callback);
}

function printExtraStuff(greeting) {
  return (val) => { console.log('greeting ', val)}
}

function printSteps(num) {
    console.log(num);
}

var test1 = function() { loopFunc(3, printExtraStuff('hi there') )};
test1()

var test2 = function() { loopFunc(3, printSteps )};
test2()

【讨论】:

    【解决方案3】:

    如果要在基于参数的函数中传递参数,则需要使用匿名函数(callback 是一个参数)。你的代码应该是这样的:

    function sayHello(input) {
      console.log(input)
    }
    
    const works = () => sayHello('hello'); 
    works();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2014-11-14
      相关资源
      最近更新 更多