ESLint的"no-undef"规则将我对Underscore的使用视为未定义变量

92
我正在使用Grunt作为我的构建工具,ESLint作为我的代码检查工具来开发一个应用程序。我也在应用程序中使用了Underscore Node包,并在其中使用了它。不幸的是,当我在我的代码上运行ESLint时,在以下行中,它认为_是未定义的变量: return _.pluck(objects, nameColumn); 这是它给我的错误提示: 78:21 error "_" is not defined no-undef 我不想禁用ESLint的no-undef规则,并且我已经尝试安装Underscore插件,但我仍然收到此错误。如果有其他任何人有关于如何解决这个问题的想法,我将非常感激!
如果我能提供任何进一步的信息来帮助任何人帮助我解决这个问题,请告诉我!
2个回答

237
官方文档可以让您了解如何解决此问题。
任何对未声明变量的引用都会导致警告,除非变量在/*global ...*/注释中显式提到,或在配置文件的globals键中指定。 最简单的解决方法是添加:
/* global _ */

位于您的文件顶部。

或者更好的方法是明确指定变量为只读,以防止覆盖变量:

/* global _:readonly */

但由于您需要为每个新的js文件执行此操作,这可能会变得很烦人。如果您经常使用下划线,我建议您将全局变量添加到您的.eslintrc文件中,例如:

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

将此内容保存为.eslintrc,位于项目根目录下,或选择保存在您的用户主目录中。虽然有人说后者不建议使用,但有时确实很方便,但您必须记住您在那里保存了它:)
上述规则的解释: "_": "readonly"(曾用名"_": false,现已弃用)表示名为_的变量告诉eslint这个变量是全局定义的,并且不会发出任何no-undef 错误。正如@sebastian指出的那样,"readonly"(或false - 废弃)意味着该变量不能被重写,因此代码_ = 'something else'会产生一个no-global-assign错误。如果您改为使用"_": "writable"(或"_": true - 废弃),这意味着该值可以被重新分配,并且之前提到的错误将不会发生。
但请记住,这仅会在直接分配给全局变量的情况下发生,就像我在示例中展示的那样。您仍然可以对其进行遮蔽,而eslint不会说任何话。例如,这些代码片段不会产生no-global-assign错误:
const _ = 'haha I broke your _' 

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

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

2
你应该将值设置为 false,以禁止覆盖,不是吗? - sebastian
@sebastian 这要看情况,可能有这样做的情况。但我同意大多数情况应该是 false,所以我已经将您的观察加入了答案。发现得好! - Marko Gresak
1
你不应该使用 false,因为它已经被弃用了。你应该使用 readonly 代替。来源:Eslint 全局配置 - Ser
2
@Ser 感谢您指出这一点,我已经更新了答案,将 false 改为 "readonly",将 true 改为 "writable" - Marko Gresak

7
如果您在环境中使用jest进行测试,可以在eslintrc.json中进行配置。
"env":{
    "jest":true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接