one-var
強制變數在函數中一起宣告或分開宣告
可以使用 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 中引入。