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 ;
Примеры правильного кода для этого правила:
/*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"*/
;
Bar.prototype.baz = function () {
; // Intended to be this.a = 1;
};
Глобальные переменные только для чтения
Это правило также запрещает повторные объявления глобальных переменных только для чтения и присваивания глобальным переменным только для чтения.
Глобальная переменная только для чтения может быть встроенной глобальной переменной ES (например, Array), глобальной переменной, специфичной для среды (например, window в среде браузера), или глобальной переменной, определённой как readonly в файле конфигурации или в комментарии /*global */.
Примеры неправильного кода для этого правила:
/*eslint no-implicit-globals: "error"*/
/*global foo:readonly*/
;
;
var ;
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 ;
let ;
Примеры правильного кода для этого правила с опцией "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 ;
Примеры правильного кода для этого правила с опцией "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;
Когда не следует использовать
В случае скрипта для браузера, если вы хотите явно объявлять переменные и функции в глобальной области видимости, и ваш код находится в строгом режиме или вы не хотите, чтобы это правило предупреждало вас об объявленных переменных, а также не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.
В случае модуля CommonJS, если ваш код находится в строгом режиме или вы не хотите, чтобы это правило предупреждало вас об объявленных переменных, а также не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.
В случае модуля ES, если вы не хотите, чтобы это правило предупреждало вас о глобальных переменных только для чтения, вы можете отключить это правило.
Связанные правила
Версия
Это правило было введено в ESLint v2.0.0-alpha-1.
Дополнительные материалы для чтения
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-implicit-globals