Как правильно написать глобальный констант в javascript es6?

javascript

5453 просмотра

3 ответа

1697 Репутация автора

Как правильно написать глобальный констант в сценарии в javascript es6 и использовать его в каком-либо другом сценарии?

Автор: phongyewtong Источник Размещён: 19.07.2016 08:02

Ответы (3)


11 плюса

748253 Репутация автора

Решение

Вы просто используете 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.

Автор: T.J. Crowder Размещён: 19.07.2016 08:05

0 плюса

135399 Репутация автора

Вы можете создать глобальную переменную в глобальной области видимости

<script>
  var MYGLOBAL = 1;

и так же вы можете создать глобальную константу, как

const MYGLOBAL = 1;

Чтобы сделать его глобальным и доступным для всех функций в вашем скрипте, вы должны объявить его вне области своих функций, т. Е. На глобальном уровне.

Вы можете сослаться на MDN const для справки:

Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.

Также вы можете прочитать эту статью: ES6 const не об неизменности

Автор: Rahul Tripathi Размещён: 19.07.2016 08:05

2 плюса

881 Репутация автора

Хорошие ответы выше, особенно примечание о том, что «const, let и class не создают свойств для глобального объекта».

Просто добавьте, остерегайтесь последствий того, что относится к IFrames.

В IFrame вы можете получить доступ к переменным, определенным в родительском окне (если они происходят из одного домена), ссылаясь на «parent.someVar».

Но поскольку const, let или class не добавляются к свойствам их глобального объекта, iFrame не может получить доступ к переменным, определенным const или let в родительском окне. Но вы МОЖЕТЕ, если вы определили их как переменные с помощью 'var', в родительском окне.

Таким образом, var дает вам более глобальную ссылку, чем const или let. Если вам нужно создать переменную, которая доступна в подкадрах, вам нужно использовать 'var', чтобы объявить ее. И тогда он не будет «постоянным».

Поэтому один из способов ответить на ваш вопрос - сказать, что хотя вы можете определять «глобальные переменные» с помощью «var», вы не можете определить (действительно) «глобальные константы», потому что если они объявлены с помощью «const», они не будут видны в iFrames, если они определены с помощью 'var', они не будут константами.

Если нет какого-либо способа доступа к концам, определенным в родительском окне. Я не нашел ни одного. Есть?

Автор: Panu Logic Размещён: 20.08.2018 01:16
Вопросы из категории :
32x32