one-var
強制變數在函式中一起宣告或分開宣告
此規則回報的一些問題可透過 --fix
命令列選項自動修正
變數可以使用 var
、let
或 const
在 JavaScript 程式碼中的任何點宣告。有許多與變數宣告相關的風格和偏好,其中之一是決定在單一函式中應該允許多少個變數宣告。
在這方面有兩種思維流派
- 函式中所有變數應該只有一個變數宣告。該宣告通常會出現在函式頂部。
- 您應該為每個要定義的變數使用一個變數宣告。
例如
// 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
) 或區塊 (針對 let
和 const
) 範圍中一起宣告或分開宣告。
選項
此規則有一個選項,可以是字串選項或物件選項。
字串選項
"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;
let qux;
}
function foo2(){
const bar = false;
let qux;
}
function foo3() {
var bar;
if (baz) {
}
}
class C {
static {
var foo;
}
static {
var foo;
if (bar) {
}
}
static {
let foo;
}
}
使用預設 "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() {
}
function foo2() {
if (baz) {
qux = true;
}
}
function foo3(){
}
class C {
static {
}
}
使用 "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;
}
function foo2(){
var bar = 1;
qux();
var qux = 3;
}
class C {
static {
var foo;
let baz;
}
}
使用 "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;
}
function foo2() {
}
使用 { 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: "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" }]*/
使用 { 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;
}
function foo2() {
const a = 1,
b = 2;
}
使用 { 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: "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 foo = true;
}
使用 { "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() {
}
使用 { "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 e = 3;
}
使用 { "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;
foo();
var c = 3;
}
使用 { "initialized": "consecutive" }
選項時,此規則的正確程式碼範例
/*eslint one-var: ["error", { "initialized": "consecutive" }]*/
function foo() {
var a = 1,
b = 2;
foo();
var c = 3,
d = 4;
}
相容性
- JSHint:此規則對應於
onevar
JSHint 規則,但允許單獨設定let
和const
。 - JSCS:此規則大致對應於 disallowMultipleVarDecl。
- JSCS:此規則選項
separateRequires
大致對應於 requireMultipleVarDecl。
版本
此規則於 ESLint v0.0.9 中引入。