Использование переменных до их объявления
Запретить использование переменных до их объявления
В JavaScript до ES6 объявления переменных и функций поднимаются в начало области видимости, поэтому можно использовать идентификаторы до их формального объявления в коде. Это может быть запутанным, и некоторые считают, что лучше всегда объявлять переменные и функции перед их использованием.
В ES6, связывания уровня блока (let и const) вводят «временную мёртвую зону», где будет брошено ReferenceError при любой попытке доступа к переменной до её объявления.
Подробности правила
Это правило будет выдавать предупреждение при обнаружении ссылки на идентификатор, который ещё не был объявлен.
Примеры неправильного кода для этого правила:
/*eslint no-use-before-define: "error"*/
alert();
var a = 10;
();
function f() {}
function g() {
return ;
}
var b = 1;
{
alert();
let c = 1;
}
{
class C extends {}
}
{
class C {
static x = "foo";
[.x]() {}
}
}
{
const C = class {
static x = ;
}
}
{
const C = class {
static {
.x = "foo";
}
}
}
export { };
const foo = 1;
Примеры правильного кода для этого правила:
/*eslint no-use-before-define: "error"*/
var a;
a = 10;
alert(a);
function f() {}
f(1);
var b = 1;
function g() {
return b;
}
{
let c;
c++;
}
{
class C {
static x = C;
}
}
{
const C = class C {
static x = C;
}
}
{
const C = class {
x = C;
}
}
{
const C = class C {
static {
C.x = "foo";
}
}
}
const foo = 1;
export { foo };
Параметры
{
"no-use-before-define": ["error", {
"functions": true,
"classes": true,
"variables": true,
"allowNamedExports": false
}]
}
-
functions(boolean) - Флаг, показывающий, проверяет ли это правило объявления функций. Если этоtrue, это правило предупреждает о каждой ссылке на функцию до объявления функции. В противном случае, игнорирует эти ссылки. Объявления функций поднимаются, поэтому это безопасно. По умолчаниюtrue. -
classes(boolean) - Флаг, показывающий, проверяет ли это правило объявления классов в верхних областях видимости. Если этоtrue, это правило предупреждает о каждой ссылке на класс до объявления класса. В противном случае, игнорирует эти ссылки, если объявление находится в верхних областях видимости функций. Объявления классов не поднимаются, поэтому это может быть опасно. По умолчаниюtrue. -
variables(boolean) - Этот флаг определяет, проверяет ли правило объявления переменных в верхних областях видимости. Если этоtrue, правило предупреждает о каждой ссылке на переменную до объявления переменной. В противном случае, правило игнорирует ссылку, если объявление находится в более высоком уровне видимости, но всё ещё сообщает о ссылке, если она находится в той же области видимости, что и объявление. По умолчаниюtrue. -
allowNamedExports(boolean) - Если этот флаг установлен вtrue, правило всегда разрешает ссылки вexport {};объявлениях. Эти ссылки безопасны, даже если переменные объявлены позже в коде. По умолчаниюfalse.
Это правило принимает "nofunc" строку в качестве параметра. "nofunc" эквивалентно { "functions": false, "classes": true, "variables": true, "allowNamedExports": false }.
Функции
Примеры правильного кода для параметра { "functions": false }:
/*eslint no-use-before-define: ["error", { "functions": false }]*/
f();
function f() {}
Этот параметр разрешает ссылки на объявления функций. Для выражений функций и стрелочных функций, пожалуйста, обратитесь к параметру variables.
Классы
Примеры неправильного кода для параметра { "classes": false }:
/*eslint no-use-before-define: ["error", { "classes": false }]*/
new ();
class A {
}
{
class C extends {}
}
{
class C extends {}
class D {}
}
{
class C {
static x = "foo";
[.x]() {}
}
}
{
class C {
static {
new ();
}
}
class D {}
}
Примеры правильного кода для параметра { "classes": false }:
/*eslint no-use-before-define: ["error", { "classes": false }]*/
function foo() {
return new A();
}
class A {
}
Переменные
Примеры неправильного кода для параметра { "variables": false }:
/*eslint no-use-before-define: ["error", { "variables": false }]*/
console.log();
var foo = 1;
();
const f = () => {};
();
const g = function() {};
{
const C = class {
static x = ;
}
}
{
const C = class {
static x = ;
}
const foo = 1;
}
{
class C {
static {
this.x = ;
}
}
const foo = 1;
}
Примеры правильного кода для параметра { "variables": false }:
/*eslint no-use-before-define: ["error", { "variables": false }]*/
function baz() {
console.log(foo);
}
var foo = 1;
const a = () => f();
function b() { return f(); }
const c = function() { return f(); }
const f = () => {};
const e = function() { return g(); }
const g = function() {}
{
const C = class {
x = foo;
}
const foo = 1;
}
Разрешить именованные экспорты
Примеры правильного кода для параметра { "allowNamedExports": true }:
/*eslint no-use-before-define: ["error", { "allowNamedExports": true }]*/
export { a, b, f, C };
const a = 1;
let b;
function f () {}
class C {}
Примеры неправильного кода для параметра { "allowNamedExports": true }:
/*eslint no-use-before-define: ["error", { "allowNamedExports": true }]*/
export default ;
const a = 1;
const b = ;
export const c = 1;
export function foo() {
return ;
}
const d = 1;
Версия
Это правило было введено в ESLint v0.0.9.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-use-before-define