no-shadow
Запрещает объявление переменных, затеняющих переменные, объявленные во внешней области видимости
Затенение — это процесс, при котором локальная переменная имеет то же имя, что и переменная в содержащей её области видимости. Например:
var a = 3;
function b() {
var a = 10;
}
В этом случае переменная a внутри b() затеняет переменную a во внешней области видимости. Это может вызвать путаницу при чтении кода, и глобальную переменную будет невозможно получить.
Подробности правила
Это правило направлено на устранение затенения переменных.
Примеры неправильного кода для этого правила:
/*eslint no-shadow: "error"*/
var a = 3;
function b() {
var = 10;
}
var c = function () {
var = 10;
}
function d() {
a = 10;
}
d(a);
if (true) {
let = 5;
}
Параметры
Это правило принимает один параметр, объект, с свойствами "builtinGlobals", "hoist", "allow" и "ignoreOnInitialization".
{
"no-shadow": ["error", { "builtinGlobals": false, "hoist": "functions", "allow": [], "ignoreOnInitialization": false }]
}
builtinGlobals
Параметр builtinGlobals по умолчанию установлен в значение false. Если он установлен в значение true, правило предотвращает затенение встроенных глобальных переменных: Object, Array, Number и так далее.
Примеры неправильного кода для параметра { "builtinGlobals": true }:
/*eslint no-shadow: ["error", { "builtinGlobals": true }]*/
function foo() {
var = 0;
}
hoist
Параметр hoist имеет три значения:
-
functions(по умолчанию) — проверяет затенение до определения внешних функций. -
all— проверяет все затенения до определения внешних переменных/функций. -
never— никогда не проверяет затенение до определения внешних переменных/функций.
hoist: функции
Примеры неправильного кода для параметра { "hoist": "functions" } по умолчанию:
/*eslint no-shadow: ["error", { "hoist": "functions" }]*/
if (true) {
let = 6;
}
function b() {}
Хотя let b в операторе if предшествует объявлению функции во внешней области видимости, это неправильно.
Примеры правильного кода для параметра { "hoist": "functions" } по умолчанию:
/*eslint no-shadow: ["error", { "hoist": "functions" }]*/
if (true) {
let a = 3;
}
let a = 5;
Поскольку let a в операторе if предшествует объявлению переменной во внешней области видимости, это правильно.
hoist: все
Примеры неправильного кода для параметра { "hoist": "all" }:
/*eslint no-shadow: ["error", { "hoist": "all" }]*/
if (true) {
let = 3;
let = 6;
}
let a = 5;
function b() {}
hoist: никогда
Примеры правильного кода для параметра { "hoist": "never" }:
/*eslint no-shadow: ["error", { "hoist": "never" }]*/
if (true) {
let a = 3;
let b = 6;
}
let a = 5;
function b() {}
Поскольку let a и let b в операторе if предшествуют объявлениям во внешней области видимости, они правильные.
allow
Параметр allow — это массив имён идентификаторов, для которых разрешено затенение. Например, "resolve", "reject", "done", "cb".
Примеры правильного кода для параметра { "allow": ["done"] }:
/*eslint no-shadow: ["error", { "allow": ["done"] }]*/
import async from 'async';
function foo(done) {
async.map([1, 2], function (e, done) {
done(null, e * 2)
}, done);
}
foo(function (err, result) {
console.log({ err, result });
});
ignoreOnInitialization
Параметр ignoreOnInitialization по умолчанию установлен в значение false. Если он установлен в значение true, он предотвращает сообщение об ошибке затенения переменных в их инициализаторах, когда затеняемая переменная предположительно ещё не инициализирована.
Затеняемая переменная должна быть слева. Затеняющая переменная должна быть справа и объявлена в функции обратного вызова или в IIFE.
Примеры неправильного кода для параметра { "ignoreOnInitialization": "true" }:
/*eslint no-shadow: ["error", { "ignoreOnInitialization": true }]*/
var x = => x;
Так как затеняющая переменная x затенение уже инициализированной затеняемой переменной x.
Примеры правильного кода для параметра { "ignoreOnInitialization": true }:
/*eslint no-shadow: ["error", { "ignoreOnInitialization": true }]*/
var x = foo(x => x)
var y = (y => y)()
Обоснование для функций обратного вызова заключается в предположении, что они будут вызваны во время инициализации, так что в момент использования затеняющей переменной затеняемая переменная ещё не была инициализирована.
Связанные правила
Версия
Это правило было введено в ESLint v0.0.9.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-shadow