【问题标题】:Which is the best way in Javascript to set instances of an object as function parameters在Javascript中将对象实例设置为函数参数的最佳方法是什么
【发布时间】:2016-08-25 08:01:34
【问题描述】:

如果这个问题很愚蠢,请原谅,但我需要问一下。

我不久前开始使用回调函数,我想知道我是否做得最好。

我现在正在做的事情是这样的:

function foo(someArg, callbackFunc, callbackArg1, callbackArg1, callbackArg3, .. callbackArgN);

为了使我的代码更清晰、更易于维护,我想要实现的是:

callBackArgs= {
 0: callbackArg1, 
 1: callbackArg1, 
 2: callbackArg3,
 .
 . 
 N: callbackArgN
}

我想像这样执行 foo() :

function foo(someArg, callbackFunc, callBackArgs)

然后在 foo 函数中,我想以一种可以将它们用作 callbackFunc 的参数的方式操作 callBackArgs。

PS。物体的长度并不总是一样的。

【问题讨论】:

  • 如果你在 ES6 上尝试使用 Spread 语法 - 萌信息在这里:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • 为什么需要将回调的所有参数传递给调用它的函数?
  • 是的,传递你要传递给回调的参数听起来很奇怪,应该没有必要。如果需要,回调可以“携带”它自己的参数,并且您的 foo 会在需要时将其他参数传递给回调。 foo 不必担心或知道callbackFunc 的额外参数不是源自foo 本身。
  • 好的,在这种情况下...我仍然认为您不需要传递所有参数。我的问题是,可能有更好的方法来构建代码,这样您就不需要传递所有这些值。
  • @nnnnnn 也许我应该退后一步,重新考虑一下代码结构。

标签: javascript function callback arguments


【解决方案1】:

您通常根本不会这样做……听起来您要求这样做:

function foo(callback, callbackArgs) {
    callback.apply(null, callbackArgs);
}

foo(bar, ['baz', 42]);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

但是,这将关注回调参数的责任放在foo 上,这只会使整个实现更加复杂。回调应该关心它自己的参数:

function foo(callback) {
    callback();
}

foo(function () { bar('baz', 42); });
// or
foo(bar.bind(null, 'baz', 42));

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

【讨论】:

    【解决方案2】:

    只需为callBackArgs 使用一个数组。

    然后当你想调用callbackFunc 时使用:callbackFunc.apply(this, callBackArgs

    这类似于调用callbackFunc(callbackArgs[0], ... callbackArgs[n])

    【讨论】:

      【解决方案3】:
      function callbackFunc(){
        console.log('callback called');
      }
      
      foo.apply(this, ['someArg', callbackFunc, 1,2,3,4]);
      

      您可以使用 JavaScript 的 apply 函数调用它,将所有参数作为数组提供。 1,2,3,4 你是这个场景中的回调参数。

      【讨论】:

        【解决方案4】:

        您可以简单地使用arguments 对象,它将为您提供所有参数。 MDN

        如下定义你的函数:

        function foo () {
            console.log(arguments) // [someArg, callbackFunc, callbackArg1, callbackArg1, callbackArg3, .. ,callbackArgN]
        }
        

        只需通过foo(someArg, callbackFunc, callbackArg1, callbackArg1, callbackArg3, .. ,callbackArgN) 调用您的函数

        【讨论】:

          【解决方案5】:

          无论你想做什么都是好的!如果要操作其他函数中的参数,请遵循相同的方法。

          使用 callBackArgs 作为对象可以轻松找到参数并进行相应操作。

          尝试有一个临时数组 (tempArray) 并在操作后将所有参数推入其中并调用

            callbackFn.apply(this, tempArray)
          

          当你需要时。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-23
            • 2010-11-15
            • 2017-06-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多