文档

JSHint 是一款程序,用于标记 JavaScript 程序中可疑的用法。核心项目包括库本身以及作为 Node 模块分发的 CLI 程序。

更多文档:所有 JSHint 选项列表 · 命令行界面 · API · 编写自己的报告器 · 常见问题解答

基本用法

首先,查看安装说明,了解如何在您首选的环境中安装 JSHint。命令行可执行文件和 JavaScript API 都提供了配置 JSHint 行为的独特方法。最常见的用法是

无论您首选的环境是什么,您都可以通过指定任意数量的代码风格选项来控制 JSHint 的行为。此外,JSHint 将遵守输入源代码中声明的任何指令——有关更多信息,请参阅内联指令部分

配置

JSHint 带有一组默认警告,但它被设计为非常可配置的。有三种主要方法可以配置您的 JSHint 副本:您可以通过 --config 标志手动指定配置文件,使用特殊的 .jshintrc 文件,或将您的配置放入项目 package.json 文件的 jshintConfig 属性中。对于 .jshintrc,JSHint 将从与正在检查的文件相同的目录开始搜索此文件。如果未找到,它将向上移动一个目录级别,一直到文件系统根目录。(请注意,如果输入来自 stdin,JSHint 不会尝试查找配置文件)

此设置允许您每个项目使用不同的配置文件。将您的文件放入项目根目录,只要您从项目目录树中的任何位置运行 JSHint,就会使用相同的配置文件。

配置文件是一个简单的 JSON 文件,用于指定要启用或禁用哪些 JSHint 选项。例如,以下文件将启用有关未定义和未使用变量的警告,并告诉 JSHint 一个名为 MY_GLOBAL 的全局变量。

{
  "undef": true,
  "unused": true,
  "globals": {
    "MY_GLOBAL": true
  }
}

内联配置

除了使用配置文件外,您还可以使用特殊注释从文件内部配置 JSHint。这些注释以 jshintglobals 等标签开头(完整列表如下),后跟以逗号分隔的值列表。例如,以下代码片段将启用有关未定义和未使用变量的警告,并告诉 JSHint 一个名为 MY_GLOBAL 的全局变量。

/* jshint undef: true, unused: true */
/* globals MY_GLOBAL */

您可以使用多行和单行注释来配置 JSHint。这些注释的作用域是函数,这意味着如果您将它们放在函数内部,它们只会影响该函数的代码。

指令

以下是 JSHint 支持的配置指令列表

jshint

用于设置 JSHint 选项的指令。

/* jshint strict: true */

jslint

用于设置与 JSHint 兼容的 JSLint 选项的指令。

/* jslint vars: true */

globals

用于告诉 JSHint 在其他地方定义的全局变量的指令。如果值为 false(默认值),JSHint 将认为该变量为只读。影响 undef 选项。

/* globals MY_LIB: false */

您还可以将某些全局变量列入黑名单,以确保它们在当前文件中未使用。

/* globals -BAD_LIB */

exported

用于告诉 JSHint 在当前文件中定义但在其他地方使用的全局变量的指令。影响 unused 选项。

/* exported EXPORTED_LIB */

members

用于告诉 JSHint 您打算使用的所有属性的指令。此指令已弃用。

ignore

用于告诉 JSHint 忽略一段代码的指令。

// Code here will be linted with JSHint.
/* jshint ignore:start */
// Code here will be ignored by JSHint.
/* jshint ignore:end */

ignore:startignore:end 之间的所有代码都不会传递给 JSHint,因此您可以使用任何语言扩展,例如 Facebook React。此外,您可以使用尾随注释忽略单行

ignoreThis(); // jshint ignore:line

选项

通常,当您需要根据自己的喜好调整 JSHint 时,您只需找到合适的选项即可。尝试弄清楚 JSHint 选项的工作原理可能会令人困惑和沮丧(我们正在努力解决这个问题!),因此请仔细阅读以下几段。

JSHint 有两种类型的选项:强制和放宽。前者用于使 JSHint 更加严格,而后者用于抑制某些警告。以以下代码为例

function main(a, b) {
  return a == null;
}

当使用默认的 JSHint 选项运行时,此代码将产生以下警告

line 2, col 14, Use '===' to compare with 'null'.

假设您知道自己在做什么,并且想禁用生成的警告,但同时您也想知道是否有任何定义但从未使用的变量。在这种情况下,您需要做的是启用两个选项:一个放宽选项,用于抑制 === null 警告,以及一个强制选项,用于启用对未使用变量的检查。在您的情况下,这些选项是 unusedeqnull

/*jshint unused:true, eqnull:true */
function main(a, b) {
  return a == null;
}

之后,JSHint 在检查此示例代码时将产生以下警告

demo.js: line 2, col 14, 'main' is defined but never used.
demo.js: line 2, col 19, 'b' is defined but never used.

有时 JSHint 没有合适的选项来禁用某些特定的警告。在这种情况下,您可以使用 jshint 指令通过其代码禁用警告。假设您有一个通过将多个不同的文件组合成一个文件创建的文件

"use strict";
/* ... */

// From another file
function b() {
  "use strict";
  /* ... */
}

此代码将触发有关函数 b 中不必要的指令的警告。JSHint 发现已经有一个全局的 "use strict" 指令,并通知您所有其他指令都是冗余的。但是您不想删除这些指令,因为该文件是自动生成的。解决方案是使用 --verbose 标志运行 JSHint 并记下警告代码(在本例中为 W034)

$ jshint --verbose myfile.js
myfile.js: line 6, col 3, Unnecessary directive "use strict". (W034)

然后,要隐藏此警告,只需将以下代码片段添加到您的文件中

/* jshint -W034 */

需要注意的一些事项

  1. 此语法仅适用于警告(代码以 W 开头),不适用于错误(代码以 E 开头)。
  2. 此语法将禁用所有具有此代码的警告。某些警告比其他警告更通用,因此请谨慎操作。

要重新启用已使用上述代码片段禁用的警告,您可以使用

/* jshint +W034 */

这在您有导致警告但您知道在上下文中是安全的代码时特别有用。在这些情况下,您可以像上面一样禁用警告,然后在之后重新启用警告

var y = Object.create(null);
// ...
/*jshint -W089 */
for (var prop in y) {
    // ...
}
/*jshint +W089 */

此页面包含 JSHint 支持的所有选项的列表。

switch 语句

默认情况下,当您在 switch 语句中省略 breakreturn 语句时,JSHint 会发出警告

switch (cond) {
case "one":
  doSomething(); // JSHint will warn about missing 'break' here.
case "two":
  doSomethingElse();
}

如果您确实知道自己在做什么,您可以通过添加 /* falls through */ 注释来告诉 JSHint 您打算让 case 块贯穿。

switch (cond) {
case "one":
  doSomething();
  /* falls through */
case "two":
  doSomethingElse();
}