版本

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;
}

單一宣告思維流派是基於 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 中引入。

資源

變更語言