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 中引入。