Spec-Zone.ru › ESLint

no-shadow

Запрещает объявление переменных, затеняющих переменные, объявленные во внешней области видимости

Затенение — это процесс, при котором локальная переменная имеет то же имя, что и переменная в содержащей её области видимости. Например:

var a = 3;
function b() {
    var a = 10;
}

В этом случае переменная a внутри b() затеняет переменную a во внешней области видимости. Это может вызвать путаницу при чтении кода, и глобальную переменную будет невозможно получить.

Подробности правила

Это правило направлено на устранение затенения переменных.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint no-shadow: "error"*/

var a = 3;
function b() {
    var a = 10;
}

var c = function () {
    var a = 10;
}

function d(a) {
    a = 10;
}
d(a);

if (true) {
    let a = 5;
}

Параметры

Это правило принимает один параметр, объект, с свойствами "builtinGlobals", "hoist", "allow" и "ignoreOnInitialization".

{
    "no-shadow": ["error", { "builtinGlobals": false, "hoist": "functions", "allow": [], "ignoreOnInitialization": false }]
}

builtinGlobals

Параметр builtinGlobals по умолчанию установлен в значение false. Если он установлен в значение true, правило предотвращает затенение встроенных глобальных переменных: Object, Array, Number и так далее.

Примеры неправильного кода для параметра { "builtinGlobals": true }:

Открыть в Playground
/*eslint no-shadow: ["error", { "builtinGlobals": true }]*/

function foo() {
    var Object = 0;
}

hoist

Параметр hoist имеет три значения:

  • functions (по умолчанию) — проверяет затенение до определения внешних функций.
  • all — проверяет все затенения до определения внешних переменных/функций.
  • never — никогда не проверяет затенение до определения внешних переменных/функций.

hoist: функции

Примеры неправильного кода для параметра { "hoist": "functions" } по умолчанию:

Открыть в Playground
/*eslint no-shadow: ["error", { "hoist": "functions" }]*/

if (true) {
    let b = 6;
}

function b() {}

Хотя let b в операторе if предшествует объявлению функции во внешней области видимости, это неправильно.

Примеры правильного кода для параметра { "hoist": "functions" } по умолчанию:

Открыть в Playground
/*eslint no-shadow: ["error", { "hoist": "functions" }]*/

if (true) {
    let a = 3;
}

let a = 5;

Поскольку let a в операторе if предшествует объявлению переменной во внешней области видимости, это правильно.

hoist: все

Примеры неправильного кода для параметра { "hoist": "all" }:

Открыть в Playground
/*eslint no-shadow: ["error", { "hoist": "all" }]*/

if (true) {
    let a = 3;
    let b = 6;
}

let a = 5;
function b() {}

hoist: никогда

Примеры правильного кода для параметра { "hoist": "never" }:

Открыть в Playground
/*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"] }:

Открыть в Playground
/*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" }:

Открыть в Playground
/*eslint no-shadow: ["error", { "ignoreOnInitialization": true }]*/

var x = x => x;

Так как затеняющая переменная x затенение уже инициализированной затеняемой переменной x.

Примеры правильного кода для параметра { "ignoreOnInitialization": true }:

Открыть в Playground
/*eslint no-shadow: ["error", { "ignoreOnInitialization": true }]*/

var x = foo(x => x)

var y = (y => y)()

Обоснование для функций обратного вызова заключается в предположении, что они будут вызваны во время инициализации, так что в момент использования затеняющей переменной затеняемая переменная ещё не была инициализирована.

Связанные правила

  • no-shadow-restricted-names

Версия

Это правило было введено в ESLint v0.0.9.

Дополнительная литература

Затенение переменных — Википедия

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-shadow

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API