下划线作为 JavaScript 变量?

IT技术 javascript
2021-02-27 03:17:22

这篇文章中Nick Craver提供了一个他使用的答案:

function(_, id)

此代码在使用下划线之前不会将其声明为变量。我在 google 和 here 上的搜索仅指向使用下划线作为前缀的引用,而不是作为变量本身。它有什么作用?我喜欢尼克的解决方案,但这让我很困扰。

6个回答

我已经看到下划线用来表示该变量是一个“无关”变量。这意味着它无关紧要,根本不使用。

在您指出的情况下,它用于表示他的函数有两个参数,但他只需要第二个参数。

此外,万一其他人想知道,他写function(_, id)而不是的原因function(id)是因为 jQueryattr()接受一个具有 2 个参数的函数,元素索引和属性。他不需要索引;这就是为什么他将其标记为“不在乎”的原因。
2021-04-25 03:17:22
谢谢伊万。但是你知道为什么它可以在不声明的情况下使用吗?我很感激任何参考我可以阅读更多关于这个
2021-05-05 03:17:22
在您提供的示例中,_被声明为函数中的参数。他根本没有使用它。
2021-05-11 03:17:22

下划线是一个有效的 JS 变量名_上例中命名的参数可以用作任何其他变量。

但是,它通常用于向代码的后续(人类)阅读者表明传入的任何内容都不会被使用。(不过,代码的作者可能是邪恶的/无知的,并在函数中使用它)。

作为初学者,我未能收集与此答案相关的许多方面,这些方面分散在评论和其他答案中。因此,我将尝试在下面合并它们:

首先,在提到的一段代码中,下划线参数的使用如下:

$(this).val('').attr('id', function(_, id) { return id + i });

这里attr函数的 jQuery 文档中,存在一个重载形式以这种形式被描述为attr.attr( attributeName, function )function

类型:函数(整数索引,字符串属性)

因此,它需要两个参数。然而,在我们的代码中,我们只需要id,它恰好是第二个参数。

现在,由于 JS 处理函数参数的方式,我们不能将它写为function(id),因为 JS 会映射idindex(预期的第一个参数function)。因此,我们编写的函数需要有两个参数。

在这里,一个标准约定开始发挥作用。正如这里提到的

下划线字符 (_) 用作指示未使用的函数参数的标准方式。

但是,这只是惯例,而不是规则。我们可以将未使用的参数命名为 asindexunusedas well。那是,

$(this).val('').attr('id', function(unused, id) { return id + i });

将是一个有效的等价物。

因此,这种使用 _ 代替未使用参数的用法可用于任何其他具有类似覆盖形式的 jQuery 函数。例如,在这个答案中,我们可以看到在调用中下划线的用法$.text()只是为了确认,$.text()有接受函数有两个参数,如图重写的形式在这里

按样式,_通常用作占位符变量。一个不会在作用域中真正使用的变量。

尽管所有答案都解释说这是一种代码风格的“hack”,以指示未使用的参数,但它通常是一种不好的做法(想法)。它将覆盖_在父作用域中声明的任何变量这将阻止您使用定义的库_(例如 underscorejs)。它甚至不是某种优化,因为它无论如何都声明了一个变量。

您最好使用参数的描述性名称并将其视为_常规变量。缩短变量名称也被认为是不好的做法。所以,如果你打算使用这个“聪明的黑客”,请不要。

不会_在父作用域中覆盖它只是在本地作用域中隐藏它,并且由于您不打算在本地作用域中使用该变量,因此根本没有风险。虽然它在一个小的单行回调中更有意义,如果在更大的复杂回调中使用,用_描述性命名的参数替换肯定更好。
2021-05-09 03:17:22
此外,ESLint 的no-shadow规则会警告/错误关于可能隐藏父作用域变量。
2021-05-17 03:17:22