【问题标题】:How to check if a callback function passed as a parameter in Javascript has arguments or not?如何检查在Javascript中作为参数传递的回调函数是否有参数?
【发布时间】:2018-10-17 12:21:05
【问题描述】:

我必须这样做

doSomething
    .then(success)
    .catch(failure);

成功和失败是回调函数,它们会在运行时获取它们的值(我正在尝试编写一个模块)。

所以我要知道作为回调发送的函数失败应该有一个参数。

因为回调应该是这样的

function(error) {
// An error happened
}

在 JS 中有没有办法做到这一点?或者任何使这种检查成为可能的库?

编辑

只是为了澄清。我希望使用我的模块的用户(不是最终用户)发送一个函数作为参数,该参数将成为回调,我想检查发送的函数(将被回调)是否有足够的参数需要。我知道这取决于使用它的人来解决这个问题。但是为什么不试试呢?

【问题讨论】:

  • 每个函数中都暴露了一个arguments数组,你可以用它来判断是否设置了任何参数,这是你想要的吗?
  • 您为什么需要知道这些?提供该功能的人对其行为负责。如果他们不想定义参数,它不应该影响你的代码。
  • 更广泛地说,如果您希望编译时类型安全,可以使用 JS 的静态类型检查器,但这似乎超出了这个问题的关注范围。
  • ...您对术语的某些使用令人困惑。有时听起来您想验证从其他人那里收到的回调,而有时您想知道应该在自己的回调中定义哪些参数。你会从两个角度得到答案。

标签: javascript node.js callback javascript-objects


【解决方案1】:

使用 promise 回调(您的 thencatch 处理程序),它们在调用时只会传递一个参数,并且总是会传递该参数。 (如果 promise 遵守原生语义;jQuery 的 Deferred 并不总是这样。)

一般情况下:

通常你并不关心,因为在 JavaScript 中,你可以调用一个函数,其参数要么少于或多于形式参数。也就是说,这很好:

function foo(a) {
  console.log("a = " + a);
}
foo();        // Fewer arguments than params
foo(1, 2, 3); // More arguments than params

另一个你不关心的原因是,即使函数没有为它们声明形参,它也可以使用参数,方法是使用一个 rest 参数或 arguments 伪数组(你会明白为什么这个 sn -p 立即记录foo.lengthbar.length):

function foo() {
  console.log("First argument: " + arguments[0]);
}
function bar(...rest) {
  console.log("First argument: " + rest[0]);
}
foo(1);                                    // First argument: 1
bar("a");                                  // First argument: a
console.log("foo.length = " + foo.length); // foo.length = 0
console.log("bar.length = " + bar.length); // bar.length = 0

因此,只需定义您的 API 将使用什么调用回调,然后执行此操作,这取决于 API 的用户来确保他们正确使用您调用的回调。

在重要的情况下,您可以使用函数的length 属性来了解它声明了多少个形参:

function foo(a) {
  console.log("a = " + a);
}
console.log(foo.length); // 1

请注意,这将告诉您声明了多少形式参数...

  • ...不计算剩余参数 (...identifier)
  • ...只到第一个具有默认值的参数(即使后面有没有默认值的参数)

例如:

function foo(a, b = false, c) { // b has a default value
  console.log("a = " + a);
}
console.log(foo.length); // 1, even though `c` has no default value,
                         // because `c` is after `b`

function foo(a, ...rest) {
  console.log("a = " + a);
}
console.log(foo.length); // 1, because the rest parameter doesn't count

【讨论】:

  • 太棒了!我不知道长度。
  • foo.length 也可能是 0,因为它被定义为没有参数列表,并且该函数仍然需要通过 arguments 对象的参数。如果这是有道理的。英语,grrr!
  • @ibrahimmahrir:Drat,我的意思是说——现在可以了,谢谢! (是的,这在英语中是有道理的。:-))
  • 英文怎么回事?让我有点……glish。
  • @T.J.Crowder 你的粉丝。 :)
【解决方案2】:

我需要知道作为回调发送的函数是否应该有参数

您需要阅读要向其发送回调的函数的文档。它将提及如何(何时、多久以及使用什么参数)调用回调。

对于您的failure,这意味着阅读catch 的文档(假设doSomething 是本机承诺)。它表示当 Promise 被拒绝时,将使用一个参数调用回调,即拒绝原因。

或者任何可以进行这种检查的库?

您可以使用类型检查器,当您传递的函数没有预期数量的参数时,它会警告您或抛出错误。

【讨论】:

    【解决方案3】:

    调用者强制执行一定数量的回调参数可能是一种反模式,但如果你必须检查函数的length

    function test() {}
    
    function test1(a) {}
    
    function test2(a, b) {}
    
    console.log(test.length, test1.length, test2.length)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 2017-01-27
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多