正在跳过回调函数中的参数

Skipping parameters in callback function

本文关键字:参数 函数 回调      更新时间:2023-09-26

我正在使用的回调函数具有以下签名(来自http://api.jquery.com/load/):

complete(responseText, textStatus, XMLHttpRequest)

现在,我只需要第三个参数。在Lua中,有一种惯例,使用下划线来跳过函数中不需要的返回值(之所以跳过,是因为_实际上会保存该值):

var1, _, _, var4 = func()

所以我想用JavaScript做一件类似的事情,并将我的函数签名设置为:

function (_, _, XMLHttpRequest)

这种方法有什么问题吗?也许有更好/更干净的方法?

这项技术并不漂亮,但我自己也曾多次使用过。我想给那些未使用的参数起有意义的名字还是更好的(只是为了避免混淆),但你可以使用下划线。

我经常在jQuery相关的回调中看到它的使用,其中index经常作为第一个参数传入,比如

$('.foo').each(function(_, node) {
});

因为大多数时候,你并不关心那里的指数。因此,为了回答你的实际问题,使用这种技术没有错(除了困惑之外),也没有更好/更干净的方法来跳过不必要的争论。

我承认使用_是一种常见的模式,可以省略在所需参数之前的参数。这对一个参数来说很酷,也许是2。

somethingWithACallback((_, whatIAmLookingFor) => { 
  // ...
})

但我需要第五个。这意味着我必须写

somethingWithACallback((_, __, ___, ____, whatIAmLookingFor) => { 
  // ...
})

对于这种情况,我提出了这种模式:

somethingWithACallback((...args) => { 
  const whatIAmLookingFor = args[4];
})

有了销毁,你也可以做这个

somethingWithACallback((...args) => { 
  const [,,,,whatIAmLookingFor] = args;
})

并将其应用于多个参数

somethingWithACallback((...args) => { 
  const [,,,,whatIAmLookingFor,,andAnotherThing] = args;
})

从而基本上选择你需要的东西。

您使用的是两个名称相同的参数。你应该这样写:

function (_, __, myXhr)

您可以将变量定义与数组析构函数相结合。

something((...[,,req]) => { /* req.blah */ }

如果使用Typescript,则需要为参数添加类型定义,并且可以是泛型的:

something((...[,,req]: any[]) => { /* req.blah */ })

或特定:

something((...[,,req]: [ResponseText, TextStatus, XMLHttpRequest]) => { /* req.blah */ })

或者,当您放弃非必需的参数时,您可以使用any(或unknown)来表示以下参数:

something((...[,,req]: [any, any, XMLHttpRequest]) => { /* req.blah */ })

如果你觉得冗长,那么引入一种类型:

type Params = [ResponseText, TextStatus, XMLHttpRequest]
something((...[,,req]: Params) => { /* req.blah */ })