下划线作为 JavaScript 变量?
Posted
技术标签:
【中文标题】下划线作为 JavaScript 变量?【英文标题】:Underscore as a JavaScript variable? 【发布时间】:2012-07-09 13:06:45 【问题描述】:在this post,Nick Craver 提供了他使用的答案:
function(_, id)
此代码在使用前没有将下划线声明为变量。我在谷歌和这里的搜索只指向使用下划线作为前缀的引用,而不是作为变量本身。它有什么作用?我喜欢 Nick 的解决方案,但这有点困扰我。
【问题讨论】:
这种不明智的 hack 也可用于多个属性。 【参考方案1】:我见过用于表示该变量是“无关”变量的下划线。这意味着它无关紧要,根本不使用。
在您指出的情况下,它用于表示他的函数有两个参数,但他只需要第二个。
【讨论】:
谢谢伊万。但是你知道为什么它可以在没有声明的情况下使用吗?如果有任何参考资料,我将不胜感激 在您提供的示例中,_
被声明为函数中的参数。他根本没有使用它。
另外,如果其他人想知道,他写function(_, id)
而不是function(id)
的原因是因为jQuery attr()
接受一个有两个参数的函数,元素索引和属性。他不需要索引;这就是为什么他将其标记为“不在乎”。【参考方案2】:
按样式,_
通常用作占位符变量。一个不会真正在作用域中使用的变量。
【讨论】:
【参考方案3】:下划线是valid JS variable name。上例中名为_
的参数可以作为任何其他变量使用。
但是,它通常用于向代码的后续(人类)读者指示传入的任何内容都不会被使用。 (不过,代码的作者可能是邪恶的/无知的并在函数中使用它)。
【讨论】:
【参考方案4】:正如之前所有其他海报所说,它可以被视为一个占位符,以防不希望使用它。我在python中看到过类似的东西,当一个函数可以返回多个值,但只有需要的值被显式定义。
例如
a, _, c = foo(bar)
在这种情况下,'b' 的潜在返回值将被忽略(仍然可以通过 _ 访问),并且将使用 'a' 和 'c'。
【讨论】:
在解构数组时,这在 javascript 中也是可能的。const [a, _, c] = foo(bar);
【参考方案5】:
作为初学者,我未能收集与此答案相关的许多方面,这些方面分散在 cmets 和其他答案中。因此,我将尝试在下面合并它们:
首先,在提到的这段代码中,下划线参数的使用如下:-
$(this).val('').attr('id', function(_, id) return id + i );
在attr
函数here 的jQuery 文档中,存在attr
的重载形式.attr( attributeName, function )
。这种形式的function
被描述为
类型:函数(整数索引,字符串属性)
因此,它需要两个参数。然而,在我们的代码中,我们只需要id
,它恰好是第二个参数。
现在,由于 JS 处理函数参数的方式,我们不能将其写为 function(id)
,因为 JS 会将 id
映射到 index
(function
预期的第一个参数)。因此,我们编写的函数需要有两个参数。
在这里,一个标准的约定开始发挥作用。正如here所提到的,
下划线字符 (_) 用作指示未使用的函数参数的标准方式。
但是,这只是一个约定,而不是规则。我们也可以将未使用的参数命名为index
或unused
。也就是说,
$(this).val('').attr('id', function(unused, id) return id + i );
将是一个有效的等价物。
因此,这种使用 _ 来代替未使用的参数的用法可以用于任何其他具有类似重写形式的 jQuery 函数。例如,在this 的答案中,我们可以看到在对$.text()
的调用中使用了下划线。只是为了确认一下,$.text()
有一个重写的形式,它接受一个带有两个参数的函数,如 here 所示。
【讨论】:
【参考方案6】:尽管所有答案都说明这是一种代码样式“hack”来指示未使用的参数,但它通常是一种不好的做法(想法)。它将覆盖在父作用域中声明的任何变量_
。这将阻止您使用定义 _
的库(例如 underscorejs)。它甚至不是某种优化,因为它无论如何都声明了一个变量。
您最好使用参数的描述性名称并将_
视为常规变量。缩短变量名也被认为是不好的做法。所以,如果你打算使用这个“聪明的 hack”,请不要。
【讨论】:
它不覆盖父范围中的_
,它只是在本地范围中隐藏它并且因为您不打算使用该变量在本地范围内,根本没有风险。虽然在小的单行回调中更有意义,但如果在更大的复杂回调中使用,用描述性命名的参数替换 _
肯定更好。
另外,ESLint's no-shadow
rule 会警告/错误可能隐藏父范围变量。【参考方案7】:
我在一些遗留代码中看到了这种模式(由于 _ 未定义而中断),结果证明它应该使用这个库:
https://underscorejs.org/
【讨论】:
以上是关于下划线作为 JavaScript 变量?的主要内容,如果未能解决你的问题,请参考以下文章