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

tur*_*ner 66 javascript underscore.js angularjs gruntjs eslint

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

return _.pluck(objects, nameColumn);

这是它给我的错误:

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

我不想禁用ESLint的no-undef规则,我尝试安装Underscore插件,但我仍然收到此错误.如果其他人有任何想法尝试这个,我会非常感激!

如果有任何进一步的信息,我可以帮助任何人帮助我解决这个问题,请告诉我!

Mar*_*šak 173

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

最简单的解决方法是添加

/* global _ */
Run Code Online (Sandbox Code Playgroud)

在您的文件的顶部.

但是因为你必须为每个新的js文件做这件事,所以它会变得烦人.如果您经常使用下划线,我建议您将全局变量添加到您的.eslintrc文件中,例如:

{
    "globals": {
        "_": false
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其保存为.eslintrc项目根目录,或者可选择保存在用户主目录中.虽然有人说后者不推荐,但它有时候很方便,但你必须记住你有它:)


上述规则的解释:"_": false表示名为变量的变量_告诉eslint该变量是全局定义的,它不会no-undef为此变量发出任何错误.正如@sebastian指出的那样,false意味着变量无法被覆盖,因此代码_ = 'something else'会产生错误no-global-assign.如果您改为使用"_": true(这是我以前的答案),这意味着可以重新分配该值,并且不会发生前面提到的错误.

但请记住,只有直接分配给我在示例中显示的全局变量时才会发生这种情况.你仍然可以遮蔽它,而且eslint不会说什么.例如,这些片段不会产生no-global-assign:

const _ = 'haha I broke your _' 
Run Code Online (Sandbox Code Playgroud)

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

function (_) {
  console.log(_, 'might not be the _ you were looking for') 
}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该将该值设置为 `false` 以禁止覆盖吗? (2认同)
  • @Ser 感谢您指出这一点,我已经更新了答案以更改 `false` -> `"readonly"` 和 `true` -> `"writable"`。 (2认同)

小智 5

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

"env":{
    "jest":true
}
Run Code Online (Sandbox Code Playgroud)