Есть несколько вещей, которые необходимо учитывать, прежде чем пытаться ответить на этот вопрос.
Например, возьмите конструктор Object
.Это «Стандартный встроенный объект» .
window.status
является частью Window
интерфейса .
Очевидно, вы не хотите, чтобы status
ссылался на window.status
, но хотите ли вы, чтобы Object
ссылался на window.Object
?
Решение вашей проблемы с нимневозможность переопределения означает использование IIFE или модуля, который должен быть тем, чем вы в любом случае занимаетесь.
(() => {
var status = false;
if (!status) {
console.log('status is now false.');
}
})();
И чтобы предотвратить случайное использование глобальных переменных, я бы просто настроил ваш линтер напредупредить против этого.Принудительное использование такого решения, как with (fake_global)
, не только будет иметь ошибки исключительно во время выполнения, которые могут быть не обнаружены, но и будет медленнее.
В частности, с ESLint я не могу найти«хорошее» решение.Включение глобальных переменных браузера позволяет выполнять неявные операции чтения.
Я бы предложил no-implicit-globals (Так как вам все равно не следует загрязнять глобальную область действия, и это препятствует тому, чтобы var status
ничего не определялпроблема), а также не включив все глобальные переменные браузера, скажем, только window
, document
, console
, setInterval
и т. д., как вы сказали в комментариях.
Посмотрите на Среды ESLint , чтобы увидеть, какие из них вы хотите включить.По умолчанию такие вещи, как Object
и Array
находятся в глобальной области видимости, но такие вещи, как перечисленные выше и atob
, отсутствуют.
Чтобы увидеть точный список глобальных переменных, они определяются этот файл в ESLint и globals
NPM пакет .Я бы выбрал из (комбинации) "es6", "worker" или "shared-node-browser".
Файл eslintrc будет иметь:
{
"rules": {
"no-implicit-globals": "error"
},
"globals": {
"window": "readonly",
"document": "readonly"
},
"env": {
"browser": false,
"es6": [true/false],
"worker": [true/false],
"shared-node-browser": [true/false]
}
}