版本

one-var

强制变量在函数中一起声明或单独声明

🔧 可修复

此规则报告的一些问题可以通过 --fix 命令行 选项自动修复。

变量可以使用 varletconst 在 JavaScript 代码中的任何位置声明。关于变量声明有很多风格和偏好,其中之一是决定在一个函数中允许多少个变量声明。

在这方面有两种不同的观点:

  1. 对于函数中的所有变量,应该只有一个变量声明。该声明通常出现在函数的开头。
  2. 您应该为每个要定义的变量使用一个变量声明。

例如:

// one variable declaration per function
function foo() {
    var bar, baz;
}

// multiple variable declarations per function
function foo() {
    var bar;
    var baz;
}

单声明观点基于 pre-ECMAScript 6 行为,在 pre-ECMAScript 6 中没有块作用域,只有函数作用域。由于所有 var 语句都被提升到函数的顶部,因此有些人认为,在函数的顶部以单个声明声明所有变量可以消除对作用域规则的混淆。

规则详细信息

此规则强制变量在每个函数(对于 var)或块(对于 letconst)作用域内一起声明或单独声明。

选项

此规则有一个选项,可以是字符串选项或对象选项。

字符串选项

  • "always"(默认)要求每个作用域只有一个变量声明
  • "never" 要求每个作用域有多个变量声明
  • "consecutive" 允许每个作用域有多个变量声明,但要求连续的变量声明组合成一个声明

对象选项

  • "var": "always" 要求每个函数只有一个 var 声明
  • "var": "never" 要求每个函数有多个 var 声明
  • "var": "consecutive" 要求连续的 var 声明为一个声明
  • "let": "always" 要求每个块只有一个 let 声明
  • "let": "never" 要求每个块有多个 let 声明
  • "let": "consecutive" 要求连续的 let 声明为一个声明
  • "const": "always" 要求每个块只有一个 const 声明
  • "const": "never" 要求每个块有多个 const 声明
  • "const": "consecutive" 要求连续的 const 声明为一个声明
  • "separateRequires": true 强制 requires 与声明分开

替代对象选项

  • "initialized": "always" 要求每个作用域有一个已初始化变量的变量声明
  • "initialized": "never" 要求每个作用域有多个已初始化变量的变量声明
  • "initialized": "consecutive" 要求每个作用域的连续已初始化变量的变量声明为一个声明
  • "uninitialized": "always" 要求每个作用域有一个未初始化变量的变量声明
  • "uninitialized": "never" 要求每个作用域有多个未初始化变量的变量声明
  • "uninitialized": "consecutive" 要求每个作用域的连续未初始化变量的变量声明为一个声明

always

此规则使用默认 "always" 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "always"]*/

function foo1() {
    var bar;
    var baz;
    let qux;
    let norf;
}

function foo2(){
    const bar = false;
    const baz = true;
    let qux;
    let norf;
}

function foo3() {
    var bar;

    if (baz) {
        var qux = true;
    }
}

class C {
    static {
        var foo;
        var bar;
    }

    static {
        var foo;
        if (bar) {
            var baz = true;
        }
    }

    static {
        let foo;
        let bar;
    }
}

此规则使用默认 "always" 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "always"]*/

function foo1() {
    var bar,
        baz;
    let qux,
        norf;
}

function foo2(){
    const bar = true,
        baz = false;
    let qux,
        norf;
}

function foo3() {
    var bar,
        qux;

    if (baz) {
        qux = true;
    }
}

function foo4(){
    let bar;

    if (baz) {
        let qux;
    }
}

class C {
    static {
        var foo, bar;
    }

    static {
        var foo, baz;
        if (bar) {
            baz = true;
        }
    }

    static {
        let foo, bar;
    }

    static {
        let foo;
        if (bar) {
            let baz;
        }
    }
}

never

此规则使用 "never" 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "never"]*/

function foo1() {
    var bar,
        baz;
    const qux = true,
        foobar = false;
}

function foo2() {
    var bar,
        qux;

    if (baz) {
        qux = true;
    }
}

function foo3(){
    let bar = true,
        baz = false;
}

class C {
    static {
        var foo, bar;
        let baz, qux;
    }
}

此规则使用 "never" 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "never"]*/

function foo1() {
    var bar;
    var baz;
}

function foo2() {
    var bar;

    if (baz) {
        var qux = true;
    }
}

function foo3() {
    let bar;

    if (baz) {
        let qux = true;
    }
}

class C {
    static {
        var foo;
        var bar;
        let baz;
        let qux;
    }
}

// declarations with multiple variables are allowed in for-loop initializers
for (var i = 0, len = arr.length; i < len; i++) {
    doSomething(arr[i]);
}

consecutive

此规则使用 "consecutive" 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "consecutive"]*/

function foo1() {
    var bar;
    var baz;
}

function foo2(){
    var bar = 1;
    var baz = 2;

    qux();

    var qux = 3;
    var quux;
}

class C {
    static {
        var foo;
        var bar;
        let baz;
        let qux;
    }
}

此规则使用 "consecutive" 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", "consecutive"]*/

function foo1() {
    var bar,
        baz;
}

function foo2(){
    var bar = 1,
        baz = 2;

    qux();

    var qux = 3,
        quux;
}

class C {
    static {
        var foo, bar;
        let baz, qux;
        doSomething();
        let quux;
        var quuux;
    }
}

var、let 和 const

此规则使用 { var: "always", let: "never", const: "never" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "always", let: "never", const: "never" }]*/

function foo1() {
    var bar;
    var baz;
    let qux,
        norf;
}

function foo2() {
    const bar = 1,
          baz = 2;
    let qux,
        norf;
}

此规则使用 { var: "always", let: "never", const: "never" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "always", let: "never", const: "never" }]*/

function foo1() {
    var bar,
        baz;
    let qux;
    let norf;
}

function foo2() {
    const bar = 1;
    const baz = 2;
    let qux;
    let norf;
}

此规则使用 { var: "never" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "never" }]*/

function foo() {
    var bar,
        baz;
}

此规则使用 { var: "never" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "never" }]*/

function foo() {
    var bar;
    var baz;

    // `const` and `let` declarations are ignored if they are not specified
    const foobar = 1;
    const foobaz = 2;
    const barfoo = 1, bazfoo = 2;
    let qux;
    let norf;
    let fooqux, foonorf;
}

此规则使用 { separateRequires: true } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { separateRequires: true, var: "always" }]*/

var foo = require("foo"),
    bar = "bar";

此规则使用 { separateRequires: true } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { separateRequires: true, var: "always" }]*/

var foo = require("foo");
var bar = "bar";
在游乐场中打开
/*eslint one-var: ["error", { separateRequires: true, var: "always" }]*/

var foo = require("foo"),
    bar = require("bar");

此规则使用 { var: "never", let: "consecutive", const: "consecutive" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "never", let: "consecutive", const: "consecutive" }]*/

function foo1() {
    let a,
        b;
    let c;

    var d,
        e;
}

function foo2() {
    const a = 1,
        b = 2;
    const c = 3;

    var d,
        e;
}

此规则使用 { var: "never", let: "consecutive", const: "consecutive" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "never", let: "consecutive", const: "consecutive" }]*/

function foo1() {
    let a,
        b;

    var d;
    var e;

    let f;
}

function foo2() {
    const a = 1,
          b = 2;

    var c;
    var d;

    const e = 3;
}

此规则使用 { var: "consecutive" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "consecutive" }]*/

function foo() {
    var a;
    var b;
}

此规则使用 { var: "consecutive" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { var: "consecutive" }]*/

function foo() {
    var a,
        b;
    const c = 1; // `const` and `let` declarations are ignored if they are not specified
    const d = 2;
    let e;
    let f;
}

已初始化和未初始化

此规则使用 { "initialized": "always", "uninitialized": "never" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "always", "uninitialized": "never" }]*/

function foo() {
    var a, b, c;
    var foo = true;
    var bar = false;
}

此规则使用 { "initialized": "always", "uninitialized": "never" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "always", "uninitialized": "never" }]*/

function foo() {
    var a;
    var b;
    var c;
    var foo = true,
        bar = false;
}

for (let z of foo) {
    doSomething(z);
}

let z;
for (z of foo) {
    doSomething(z);
}

此规则使用 { "initialized": "never" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "never" }]*/

function foo() {
    var foo = true,
        bar = false;
}

此规则使用 { "initialized": "never" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "never" }]*/

function foo() {
    var foo = true;
    var bar = false;
    var a, b, c; // Uninitialized variables are ignored
}

此规则使用 { "initialized": "consecutive", "uninitialized": "never" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "consecutive", "uninitialized": "never" }]*/

function foo() {
    var a = 1;
    var b = 2;
    var c,
        d;
    var e = 3;
    var f = 4;
}

此规则使用 { "initialized": "consecutive", "uninitialized": "never" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "consecutive", "uninitialized": "never" }]*/

function foo() {
    var a = 1,
        b = 2;
    var c;
    var d;
    var e = 3,
        f = 4;
}

此规则使用 { "initialized": "consecutive" } 选项的不正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "consecutive" }]*/

function foo() {
    var a = 1;
    var b = 2;

    foo();

    var c = 3;
    var d = 4;
}

此规则使用 { "initialized": "consecutive" } 选项的正确代码示例

在游乐场中打开
/*eslint one-var: ["error", { "initialized": "consecutive" }]*/

function foo() {
    var a = 1,
        b = 2;

    foo();

    var c = 3,
        d = 4;
}

兼容性

  • JSHint:此规则映射到 onevar JSHint 规则,但允许 letconst 分开配置。
  • JSCS:此规则大致映射到 disallowMultipleVarDecl
  • JSCS:此规则选项 separateRequires 大致映射到 requireMultipleVarDecl

版本

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

资源

更改语言