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;
}
单声明观点基于 pre-ECMAScript 6 行为,在 pre-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 中引入的。