ESLint的“ no-undef”规则将我对Underscore的使用称为未定义变量


73

我正在使用Grunt作为构建工具,并使用ESLint作为正在处理的应用程序的整理工具。我也在使用Underscore Node软件包,并在我的应用程序中使用了它。不幸的是,当我在代码上运行ESLint时,它认为_是以下行中的未定义变量:

return _.pluck(objects, nameColumn);

这是它给我的错误:

78:21 error "_" is not defined no-undef

我宁愿不对ESLint禁用no-undef规则,并且尝试安装Underscore插件,但仍然收到此错误。如果有人对尝试使用此方法有任何想法,我将不胜感激!

如果有任何其他我想提供的信息可以帮助任何人帮助我解决这个问题,请告诉我!

Answers:


192

官方文件应该给你如何解决这个问题的想法。

除非未在/*global ...*/注释中明确提及该变量,或者globals在配置文件键中指定了该变量,否则任何对未声明变量的引用都将导致警告。

最简单的解决方法是添加

/* global _ */

在文件的顶部。

或更佳的做法是,明确指定该变量为只读,以禁止覆盖该变量:

/* global _:readonly */

但是由于您必须为每个新的js文件执行此操作,因此它可能会令人讨厌。如果您经常使用下划线,建议您将全局变量添加到.eslintrc文件中,例如:

{
    "globals": {
        "_": "readonly"
    }
}

并将其另存为.eslintrc项目根目录或用户主目录(可选)。虽然有人说不建议使用后者,但有时可能很方便,但您必须记住您已经在这里了:)


上述规则的解释"_": "readonly"(以前是"_": false,现在已经过时)的装置,一个命名的变量_告诉这个变量是全局定义的,它不会发出任何eslintno-undef错误此变量。正如@sebastian指出的那样,"readonly"(或false不建议使用)表示该变量不能被覆盖,因此代码_ = 'something else'将产生错误no-global-assign。如果要改用"_": "writable"(或"_": true-已弃用),则意味着可以重新分配该值,并且不会发生前面提到的错误。

但是请记住,只有在直接分配给全局变量的情况下才会发生这种情况,如我在示例中所示。您仍然可以对其进行阴影处理,并保持沉默。例如,这些代码片段不会产生no-global-assign

const _ = 'haha I broke your _' 

或作为函数参数名称,例如

function (_) {
  console.log(_, 'might not be the _ you were looking for') 
}

1
您不应该将值设置为falseas禁止覆盖吗?
sebastian

@sebastian取决于情况,在某些情况下可能要这样做。但是我同意大多数情况应该是错误的,因此我将您的看法添加到了答案中。很棒!
MarkoGrešak17年

1
您不应该使用false它,因为它已被弃用。您应该写readonly。来源:Eslint全局配置
丝氨酸

1
@Ser感谢您指出这一点,我已经更新了更改false->"readonly"true->的答案"writable"
MarkoGrešak20年

6

如果您在环境中-在eslintrc.json中使用笑话进行测试

"env":{
    "jest":true
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.