版本

no-unused-vars

禁用未使用的变量

推荐

配置文件中使用 @eslint/js 中的 recommended 配置启用此规则

💡 hasSuggestions

此规则报告的某些问题可以通过编辑器建议手动修复

在代码中声明但未在任何地方使用的变量很可能是由于不完整的重构而导致的错误。 这些变量会占用代码空间,并可能导致读者感到困惑。

规则详情

此规则旨在消除未使用的变量、函数和函数参数。

如果满足以下任一条件,则变量 foo 被视为已使用

  • 它被调用 (foo()) 或构造 (new foo())
  • 它被读取 (let bar = foo)
  • 它作为参数传递给函数 (doSomething(foo))
  • 它在传递给另一个函数的函数内部被读取 (doSomething(function() { foo(); }))

如果一个变量仅被声明 (let foo = 5) 或赋值 (foo = 7),则该变量被视为已使用。

此规则的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: "error"*/
/*global some_unused_var*/

// It checks variables you have defined as global
some_unused_var = 42;

let x;

// Write-only variables are not considered as used.
let y = 10;
y = 5;

// A read for a modification of itself is not considered as used.
let z = 0;
z = z + 1;

// By default, unused arguments cause warnings.
(function(foo) {
    return 5;
})();

// Unused recursive functions also cause warnings.
function fact(n) {
    if (n < 2) return 1;
    return n * fact(n - 1);
}

// When a function definition destructures an array, unused entries from the array also cause warnings.
function getY([x, y]) {
    return y;
}
getY(["a", "b"]);

此规则的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: "error"*/

const x = 10;
alert(x);

// foo is considered used here
myFunc(function foo() {
    // ...
}.bind(this));

(function(foo) {
    return foo;
})();

var myFunc;
myFunc = setTimeout(function() {
    // myFunc is considered used
    myFunc();
}, 50);

// Only the second argument from the destructured array is used.
function getY([, y]) {
    return y;
}
getY(["a", "b"]);

exported

在 CommonJS 或 ECMAScript 模块之外的环境中,您可以使用 var 创建一个全局变量,该变量可能被其他脚本使用。 您可以使用 /* exported variableName */ 注释块来指示此变量正在导出,因此不应被视为未使用。

请注意,/* exported */ 对以下任何情况均无效

  • languageOptions.sourceTypemodule (默认) 或 commonjs
  • languageOptions.parserOptions.ecmaFeatures.globalReturntrue

行注释 // exported variableName 将不起作用,因为 exported 不是特定于行的。

/* exported global_var */

var global_var = 42;

使用 /* exported variableName */ 操作和 no-unused-vars正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: "error"*/
/* exported global_var */

var global_var = 42;

选项

此规则接受一个参数,该参数可以是字符串或对象。 字符串设置与 vars 属性的设置相同(如下所述)。

默认情况下,此规则对捕获的错误和变量启用 all 选项,对参数启用 after-used 选项。

{
    "rules": {
        "no-unused-vars": ["error", {
            "vars": "all",
            "args": "after-used",
            "caughtErrors": "all",
            "ignoreRestSiblings": false,
            "reportUsedIgnorePattern": false
        }]
    }
}

vars

vars 选项有两个设置

  • all 检查所有变量的用法,包括全局作用域中的变量。 但是,它排除其他选项(如 argscaughtErrors)所针对的变量。 这是默认设置。
  • local 仅检查是否使用了本地声明的变量,但允许全局变量未使用。

vars: local

{ "vars": "local" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "vars": "local" }]*/
/*global some_unused_var */

some_unused_var = 42;

varsIgnorePattern

varsIgnorePattern 选项指定不检查用法的例外情况:名称与正则表达式模式匹配的变量。 例如,名称包含 ignoredIgnored 的变量。 但是,它排除其他选项(如 argsIgnorePatterncaughtErrorsIgnorePattern)所针对的变量。

{ "varsIgnorePattern": "[iI]gnored" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/

const firstVarIgnored = 1;
const secondVar = 2;
console.log(secondVar);

args

args 选项有三个设置

  • after-used - 将不检查在最后一个使用的参数之前出现的未使用的位置参数,但将检查所有命名参数和最后一个使用的参数之后的所有位置参数。
  • all - 必须使用所有命名参数。
  • none - 不检查参数。

args: after-used

默认 { "args": "after-used" } 选项的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "args": "after-used" }]*/

// 2 errors, for the parameters after the last used parameter (bar)
// "baz" is defined but never used
// "qux" is defined but never used
(function(foo, bar, baz, qux) {
    return bar;
})();

默认 { "args": "after-used" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", {"args": "after-used"}]*/

(function(foo, bar, baz, qux) {
    return qux;
})();

args: all

{ "args": "all" } 选项的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "args": "all" }]*/

// 2 errors
// "foo" is defined but never used
// "baz" is defined but never used
(function(foo, bar, baz) {
    return bar;
})();

args: none

{ "args": "none" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "args": "none" }]*/

(function(foo, bar, baz) {
    return bar;
})();

argsIgnorePattern

argsIgnorePattern 选项指定不检查用法的例外情况:名称与正则表达式模式匹配的参数。 例如,名称以下划线开头的变量。

{ "argsIgnorePattern": "^_" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }]*/

function foo(x, _y) {
    return x + 1;
}
foo();

caughtErrors

caughtErrors 选项用于 catch 代码块参数验证。

它有两个设置

  • all - 必须使用所有命名参数。 这是默认设置。
  • none - 不检查错误对象。

caughtErrors: all

不指定此选项等同于将其分配给 all

{ "caughtErrors": "all" } 选项的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "caughtErrors": "all" }]*/

// 1 error
// "err" is defined but never used
try {
    //...
} catch (err) {
    console.error("errors");
}

caughtErrors: none

{ "caughtErrors": "none" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "caughtErrors": "none" }]*/

try {
    //...
} catch (err) {
    console.error("errors");
}

caughtErrorsIgnorePattern

caughtErrorsIgnorePattern 选项指定不检查用法的例外情况:名称与正则表达式模式匹配的 catch 参数。 例如,名称以字符串“ignore”开头的变量。

{ "caughtErrorsIgnorePattern": "^ignore" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "caughtErrors": "all", "caughtErrorsIgnorePattern": "^ignore" }]*/

try {
    //...
} catch (ignoreErr) {
    console.error("errors");
}

destructuredArrayIgnorePattern

destructuredArrayIgnorePattern 选项指定不检查用法的例外情况:名称与正则表达式模式匹配的数组解构模式的元素。 例如,名称以下划线开头的变量。

{ "destructuredArrayIgnorePattern": "^_" } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "destructuredArrayIgnorePattern": "^_" }]*/

const [a, _b, c] = ["a", "b", "c"];
console.log(a+c);

const { x: [_a, foo] } = bar;
console.log(foo);

function baz([_c, x]) {
    x;
}
baz();

function test({p: [_q, r]}) {
    r;
}
test();

let _m, n;
foo.forEach(item => {
    [_m, n] = item;
    console.log(n);
});

let _o, p;
_o = 1;
[_o, p] = foo;
p;

ignoreRestSiblings

ignoreRestSiblings 选项是一个布尔值(默认值:false)。 使用Rest Property 可以“省略”对象中的属性,但默认情况下,同级属性标记为“未使用”。 启用此选项后,rest 属性的同级属性将被忽略。

{ "ignoreRestSiblings": true } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/

// 'foo' and 'bar' were ignored because they have a rest property sibling.
const { foo, ...rest } = data;
console.log(rest);

// OR

let bar;
({ bar, ...rest } = data);

ignoreClassWithStaticInitBlock

ignoreClassWithStaticInitBlock 选项是一个布尔值(默认值:false)。 静态初始化块允许您在评估类定义期间初始化静态变量并执行代码,这意味着静态块代码在不创建类的新实例的情况下执行。 当设置为 true 时,此选项会忽略包含静态初始化块的类。

{ "ignoreClassWithStaticInitBlock": true } 选项的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/

class Foo {
    static myProperty = "some string";
    static mymethod() {
        return "some string";
    }
}

class Bar {
    static {
        let baz; // unused variable
    }
}

{ "ignoreClassWithStaticInitBlock": true } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "ignoreClassWithStaticInitBlock": true }]*/

class Foo {
    static {
        let bar = "some string";

        console.log(bar);
    }
}

reportUsedIgnorePattern

reportUsedIgnorePattern 选项是一个布尔值(默认值:false)。 使用此选项将报告与任何有效的忽略模式选项(varsIgnorePatternargsIgnorePatterncaughtErrorsIgnorePatterndestructuredArrayIgnorePattern)匹配的变量(如果它们已被使用)。

{ "reportUsedIgnorePattern": true } 选项的错误代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/

const firstVarIgnored = 1;
const secondVar = 2;
console.log(firstVarIgnored, secondVar);

{ "reportUsedIgnorePattern": true } 选项的正确代码示例

在 Playground 中打开
/*eslint no-unused-vars: ["error", { "reportUsedIgnorePattern": true, "varsIgnorePattern": "[iI]gnored" }]*/

const firstVar = 1;
const secondVar = 2;
console.log(firstVar, secondVar);

何时不使用

如果您不想收到有关未使用变量或函数参数的通知,您可以安全地关闭此规则。

版本

此规则在 ESLint v0.0.9 中引入。

资源

更改语言