Как правильно написать глобальный констант в javascript es6?
Как правильно написать глобальный констант в сценарии в javascript es6 и использовать его в каком-либо другом сценарии?
3 ответа
Вы просто используете const
в глобальном масштабе:
const aGlobalConstant = 42;
Это создает глобальную константу. Это не свойство глобального объекта (потому что const
, let
, а также class
не создавать свойства для глобального объекта), но это глобальная константа, доступная для всего кода, работающего в этой глобальной среде.
Однако, вероятно, стоит отметить, что тенденция состоит в том, чтобы отойти от глобальных переменных и даже отойти от выполнения любого кода в глобальной области видимости (хотя скрипты верхнего уровня в браузерах всегда будут иметь доступ к глобальной области видимости для совместимости).).
Например: в NodeJS ни один ваш код не работает в глобальной области видимости; все (включая основной скрипт, который вы запускаете через node
команда) находится в модульной среде NodeJS, которая не является глобальной областью действия. Таким образом, в NodeJS строка выше не создаст глобальную переменную, поскольку она ограничена вызовом вашего модуля. Чтобы создать настоящий глобальный объект в NodeJS (который обычно не нужен), вам нужно создать свойство для глобального объекта. Но как получить доступ к глобальному объекту? NodeJS вызывает ваш код с this
установить пустой объект (вместо обычного режима по умолчанию, где this
относится к глобальному объекту), и, конечно, нет window
в NodeJS. Ответ: NodeJS предоставляет глобальный доступный для этого: global
// Define a global constant in NodeJS
Object.defineProperty(global, "aGlobalConstant", {
value: 42
});
Это константа, потому что по умолчанию свойства создаются через Object.defineProperty
только для чтения.
Модули ES2015 делают шаг вперед по сравнению с NodeJS: вы не можете создать глобал вообще, если среда не станет такой же глобальной, как NodeJS global
доступны для вас (в этом случае вы можете сделать Object.defineProperty
вещь). По умолчанию, согласно спецификации, такого глобального нет; это просто среды, которые определяют их (window
в браузерах, global
в NodeJS, ...). И код верхнего уровня в модуле ES2015 не запускается со старым значением по умолчанию this
ссылаясь на глобальный объект (this
имеет значение undefined
в области верхнего уровня модуля ES2015), поэтому вы не можете использовать this
для этого.
Хорошие ответы выше, особенно примечание о том, что "const, let и class не создают свойств для глобального объекта".
Просто добавьте, остерегайтесь последствий того, что относится к IFrames.
В IFrame вы можете получить доступ к переменным, определенным в родительском окне (если они происходят из одного домена), ссылаясь на "parent.someVar".
Но поскольку const, let или class не добавляются к свойствам их глобального объекта, iFrame не может получить доступ к переменным, определенным const или let в родительском окне. Но вы МОЖЕТЕ, если вы определили их как переменные с помощью 'var', в родительском окне.
Таким образом, "var" дает вам более глобальную ссылку, чем "const" или "let". Если вам нужно создать переменную, которая доступна в подкадрах, вам нужно использовать 'var', чтобы объявить ее. И тогда она не будет "постоянной".
Поэтому один из способов ответить на ваш вопрос - сказать, что, хотя вы можете определять "глобальные переменные" с помощью "var", вы не можете определить (действительно) "глобальные константы", потому что если они объявлены с помощью "const", они не будут видны в iFrames, если они определены с помощью 'var', они не будут константами.
Если только нет какого-либо способа доступа к концам, определенным в родительском окне. Я не нашел ни одного. Есть?
Вы можете создать глобальную переменную в глобальной области видимости
<script>
var MYGLOBAL = 1;
и так же вы можете создать глобальную константу, как
const MYGLOBAL = 1;
Чтобы сделать его глобальным и доступным для всех функций в вашем скрипте, вы должны объявить его вне области своих функций, т. Е. На глобальном уровне.
Вы можете сослаться на MDN const для справки:
Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.
Также вы можете прочитать эту статью: ES6 const не об неизменности