no-implicit-globals
Запрещает объявления в глобальной области видимости
Рекомендуется не «загрязнять» глобальную область видимости переменными, которые должны быть локальными для скрипта.
Глобальные переменные, созданные одним скриптом, могут конфликтовать по именам с глобальными переменными, созданными другим скриптом, что обычно приводит к ошибкам времени выполнения или неожиданному поведению.
Это правило запрещает следующее:
- Объявления, создающие одну или несколько переменных в глобальной области видимости.
- Утечки глобальных переменных.
- Повторные объявления глобальных переменных только для чтения и присваивания глобальным переменным только для чтения.
Если необходимо создать глобальную переменную, это можно сделать явно, присвоив значение свойству глобального объекта.
Это правило наиболее полезно для браузерных скриптов. Объявления на верхнем уровне в модулях ES и CommonJS создают переменные в области видимости модуля. В модулях ES также неявно включён режим strict, предотвращающий утечки глобальных переменных.
По умолчанию это правило не проверяет объявления 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() {}
})();
Примеры правильного кода для этого правила с "languageOptions": { "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) или глобальной переменной, объявленной как readonly в файле конфигурации или комментарии /*global */.
См. также: Указание глобальных переменных
Примеры неправильного кода для этого правила:
/*eslint no-implicit-globals: "error"*/
/*global foo:readonly*/
;
;
var ;
exported
Можно использовать блочные комментарии /* exported variableName */ так же, как в правиле no-unused-vars. Подробности см. в разделе no-unused-vars exported.
Примеры правильного кода для операции /* exported variableName */:
/* eslint no-implicit-globals: error */
/* exported global_var */
var global_var = 42;
Параметры
У этого правила есть один параметр-объект:
- Установите
"lexicalBindings"вtrue, если нужно, чтобы это правило также проверяло объявленияconst,letиclass.
Объявления 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;
}
}());
Когда не следует использовать это правило
В браузерном скрипте это правило можно отключить, если вы хотите явно объявлять переменные и функции в глобальной области видимости, а код работает в строгом режиме или вы не хотите получать предупреждения о необъявленных переменных, а также не хотите получать предупреждения о глобальных переменных только для чтения.
В модуле 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