Spec-Zone.ru › ESLint

no-implicit-globals

Запретить объявления в глобальной области видимости

Рекомендуется избегать «загрязнения» глобальной области видимости переменными, которые должны быть локальными для скрипта.

Глобальные переменные, созданные из скрипта, могут создавать коллизии имён с глобальными переменными, созданными другим скриптом, что обычно приводит к ошибкам во время выполнения или непредсказуемому поведению.

Это правило запрещает следующее:

  • Объявления, которые создают одну или несколько переменных в глобальной области видимости.
  • Утечки глобальных переменных.
  • Повторные объявления глобальных переменных только для чтения и присваивания глобальным переменным только для чтения.

Существует явный способ создания глобальной переменной при необходимости, назначив её свойству глобального объекта.

Это правило в основном полезно для скриптов браузера. Объявления верхнего уровня в модулях ES и CommonJS создают переменные, ограниченные областью видимости модуля. Модули ES также имеют неявный strict режим, который предотвращает утечки глобальных переменных.

По умолчанию это правило не проверяет const, let и class объявления.

Это правило имеет опцию объекта с одной опцией:

  • Установите "lexicalBindings" на true , если вы хотите, чтобы это правило также проверяло const, let и class объявления.

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

var и function объявления

При работе со скриптами браузера разработчики часто забывают, что объявления переменных и функций в области видимости верхнего уровня становятся глобальными переменными в объекте window. В отличие от модулей, которые имеют свою собственную область видимости. Глобальные переменные должны быть явно назначены window или self, если это предполагалось. В противном случае переменные, предназначенные для локального использования в скрипте, должны быть заключены в IIFE.

Это правило запрещает var и function объявления в области видимости скрипта верхнего уровня. Это не относится к модулям ES и CommonJS, поскольку они имеют область видимости модуля.

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

Открыть в игровом поле
/*eslint no-implicit-globals: "error"*/

var foo = 1;

function bar() {}

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

Открыть в игровом поле
/*eslint no-implicit-globals: "error"*/

// explicitly set on window
window.foo = 1;
window.bar = function() {};

// intended to be scope to this file
(function() {
  var foo = 1;

  function bar() {}
})();

Примеры правильного кода для этого правила с "parserOptions": { "sourceType": "module" } в конфигурации ESLint:

Открыть в игровом поле
/*eslint no-implicit-globals: "error"*/

// foo and bar are local to module
var foo = 1;
function bar() {}

Утечки глобальных переменных

Когда код не находится в strict режиме, присвоение необъявленной переменной создаёт новую глобальную переменную. Это произойдёт, даже если код находится в функции.

Это не относится к модулям ES, поскольку код модуля неявным образом находится в strict режиме.

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

Открыть в игровом поле
/*eslint no-implicit-globals: "error"*/

foo = 1;

Bar.prototype.baz = function () {
    a = 1; // Intended to be this.a = 1;
};

Глобальные переменные только для чтения

Это правило также запрещает повторные объявления глобальных переменных только для чтения и присваивания глобальным переменным только для чтения.

Глобальная переменная только для чтения может быть встроенной глобальной переменной ES (например, Array), глобальной переменной, специфичной для среды (например, window в среде браузера), или глобальной переменной, определённой как readonly в файле конфигурации или в комментарии /*global */.

  • Указание сред
  • Указание глобальных переменных

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

Открыть в игровом поле
/*eslint no-implicit-globals: "error"*/

/*global foo:readonly*/

foo = 1;

Array = [];
var Object;

const, let и class объявления

Лексические объявления const и let, а также class объявления, создают переменные с областью видимости блока.

Однако, когда они объявлены в верхней части скрипта браузера, эти переменные не имеют «области видимости скрипта». Они фактически создаются в глобальной области видимости и могут создавать коллизии имён с var, const и let переменными, а также function и class объявлениями из других скриптов. Это не относится к модулям ES и CommonJS.

Если переменная должна быть локальной для скрипта, заключите код в блок или в выражение функции, вызываемое немедленно (IIFE).

Примеры правильного кода для этого правила с опцией "lexicalBindings" установленной на false (по умолчанию):

Открыть в игровом поле
/*eslint no-implicit-globals: ["error", {"lexicalBindings": false}]*/

const foo = 1;

let baz;

class Bar {}

Примеры неправильного кода для этого правила с опцией "lexicalBindings" установленной на true:

Открыть в игровом поле
/*eslint no-implicit-globals: ["error", {"lexicalBindings": true}]*/

const foo = 1;

let baz;

class Bar {}

Примеры правильного кода для этого правила с опцией "lexicalBindings" установленной на true:

Открыть в игровом поле
/*eslint no-implicit-globals: ["error", {"lexicalBindings": true}]*/

{
    const foo = 1;
    let baz;
    class Bar {}
}

(function() {
    const foo = 1;
    let baz;
    class Bar {}
}());

Если вы хотите создать глобальную const или let переменную или глобальное class объявление, которое будет использоваться другими скриптами, учтите некоторые отличия по сравнению с традиционными методами, которые var объявления и присвоение свойству глобального объекта window.

  • Лексически объявленные переменные нельзя создавать условно. Скрипт не может проверить существование переменной и затем создать новую. Переменные var также всегда создаются, но повторные объявления не вызывают ошибок во время выполнения.
  • Лексически объявленные переменные не создают свойств в глобальном объекте, что может ожидать скрипт, который их использует.
  • Лексически объявленные переменные перекрывают свойства глобального объекта, что может привести к ошибкам, если потребляющий скрипт использует и переменную, и свойство.
  • Лексически объявленные переменные могут создавать постоянную временную «мертвую зону» (TDZ), если инициализация генерирует исключение. Даже проверка typeof не защищена от исключений TDZ.

Примеры неправильного кода для этого правила с опцией "lexicalBindings" установленной на true:

Открыть в игровом поле
/*eslint no-implicit-globals: ["error", {"lexicalBindings": true}]*/

const MyGlobalFunction =(function(){const a =1;let b =2;returnfunction(){return a + b;}}());

Примеры правильного кода для этого правила с опцией "lexicalBindings" установленной на true:

Открыть в игровом поле
/*eslint no-implicit-globals: ["error", {"lexicalBindings": true}]*/

window.MyGlobalFunction = (function() {
    const a = 1;
    let b = 2;
    return function() {
        return a + b;
    }
}());

экспортированные

Вы можете использовать /* exported variableName */ блочные комментарии таким же образом, как и в no-unused-vars. Подробности см. в разделе no-unused-vars экспортированные раздел.

Примеры правильного кода для операции /* exported variableName */:

Открыть в игровом поле
/* eslint no-implicit-globals: error */
/* exported global_var */

var global_var = 42;
END_OF_DOCUMENT_MARKER

Когда не следует использовать

В случае скрипта для браузера, если вы хотите явно объявлять переменные и функции в глобальной области видимости, и ваш код находится в строгом режиме или вы не хотите, чтобы это правило предупреждало вас об объявленных переменных, а также не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.

В случае модуля CommonJS, если ваш код находится в строгом режиме или вы не хотите, чтобы это правило предупреждало вас об объявленных переменных, а также не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.

В случае модуля ES, если вы не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.

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

  • no-undef
  • no-global-assign
  • no-unused-vars

Версия

Это правило было введено в ESLint v2.0.0-alpha-1.

Дополнительные материалы для чтения

Ben Alman » Непосредственно вызываемая функция выражения (IIFE)
Ошибка ReferenceError: присвоение необъявленной переменной «x» — JavaScript | MDN
let — JavaScript | MDN

Ресурсы

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

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

Spec-Zone.ru

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