# no-inner-declarations
禁止嵌套块中的变量或 function
声明
配置文件中的 "extends": "eslint:recommended" 属性启用了该规则
在 JavaScript 中,在 ES6 之前,函数声明只允许在程序的第一级或另一个函数的主体中,尽管解析器有时 在别处错误地接受它们
。这仅适用于函数声明;命名或匿名函数表达式可以出现在允许表达式的任何地方。
// Good
function doSomething() { }
// Bad
if (test) {
function doSomethingElse () { }
}
function anotherThing() {
var fn;
if (test) {
// Good
fn = function expression() { };
// Bad
function declaration() { }
}
}
变量声明可以在语句可以到达的任何地方进行,甚至可以嵌套在其他块的深处。由于变量提升,这通常是不可取的,并且将声明移动到程序或函数体的根可以增加清晰度。请注意,块绑定
(let
, const
) 没有被吊起,因此它们不受此规则的影响。
/*eslint-env es6*/
// Good
var foo = 42;
// Good
if (foo) {
let bar1;
}
// Bad
while (test) {
var bar2;
}
function doSomething() {
// Good
var baz = true;
// Bad
if (baz) {
var quux;
}
}
# 规则详情
该规则要求函数声明和变量声明(可选)位于程序的根目录中,或位于函数主体的根目录中,或位于类静态块主体的根目录中。
# 选项
此规则有一个字符串选项:
"functions"
(默认)不允许嵌套块中的function
声明"both"
不允许嵌套块中的function
和var
声明
# functions
此规则使用默认 "functions"
选项的错误代码示例:
/*eslint no-inner-declarations: "error"*/
if (test) {
function doSomething() { }
}
function doSomethingElse() {
if (test) {
function doAnotherThing() { }
}
}
if (foo) function f(){}
class C {
static {
if (test) {
function doSomething() { }
}
}
}
此规则使用默认 "functions"
选项的正确代码示例:
/*eslint no-inner-declarations: "error"*/
function doSomething() { }
function doSomethingElse() {
function doAnotherThing() { }
}
class C {
static {
function doSomething() { }
}
}
if (test) {
asyncCall(id, function (err, data) { });
}
var fn;
if (test) {
fn = function fnExpression() { };
}
if (foo) var a;
# both
此规则使用 "both"
选项的错误代码示例:
/*eslint no-inner-declarations: ["error", "both"]*/
if (test) {
var foo = 42;
}
function doAnotherThing() {
if (test) {
var bar = 81;
}
}
if (foo) var a;
if (foo) function f(){}
class C {
static {
if (test) {
var something;
}
}
}
此规则使用 "both"
选项的正确代码示例:
/*eslint no-inner-declarations: ["error", "both"]*/
var bar = 42;
if (test) {
let baz = 43;
}
function doAnotherThing() {
var baz = 81;
}
class C {
static {
var something;
}
}
# 何时不使用
当 块作用域函数
进入 ES6 时,函数声明部分规则将被废弃,但在此之前,它应该保留以强制执行有效的构造。在使用 block-scoped-var
时禁用检查变量声明,或者在嵌套块中声明变量是否可以接受,尽管有提升。