Можно ли объявить глобальные константы в JavaScript? - PullRequest
36 голосов
/ 13 ноября 2010

Если так, каков синтаксис для такого объявления?

Ответы [ 7 ]

26 голосов
/ 13 ноября 2010

Javascript на самом деле не имеет понятия именованной константы или неизменного свойства объекта.(Обратите внимание, что здесь я не говорю о ES5.)

Вы можете объявить глобальные переменные с помощью простого объявления var в глобальной области видимости, как вне любой функции в сценарии, включенном в веб-страницу:

<script>
  var EXACTLY_ONE = 1;

Тогда ваш код, конечно, может использовать эту константу, хотя на самом деле она не является "константой", потому что значение можно изменить (свойство обновлено, другими словами).

25 голосов
/ 14 ноября 2010

Как осторожно отмечает "Pointy", ECMAscript не имеет такой функции. Однако JavaScript делает :

const a = 7;
document.writeln("a is " + a + ".");

Конечно, если вы пишете код для размещения в Интернете для работы в веб-браузерах, это может вам не сильно помочь. : -)

13 голосов
/ 13 ноября 2010

Все является глобальным, если не объявлено с ключевым словом var.

Константы тоже отсутствуют. Вы можете просто объявить их без ключевого слова var.

Если вы хотите обеспечить глобальную область видимости, вы можете выбросить ее в объект window:

window.GLOBAL_CONSTANT = "value";

Вы можете сделать это из любой области видимости. Затем константы могут быть объявлены внутри функций или замыканий, хотя я бы не рекомендовал этого.

6 голосов
/ 05 июня 2018

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

Object.defineProperty(window, 'TAU', { 
    get: function(){return Math.PI*2;}
});

Если вы хотите, чтобы общая функция делала это:

function define(name, value){
    Object.defineProperty(window, name, { 
       get: function(){return value;},
       set: function(){throw(name+' is a constant and cannot be redeclared.');},
    });
}

// Example use
define('TAU', Math.PI*2);
3 голосов
/ 30 января 2018

Если вы заботитесь только о поддержке новых браузеров (или используете для поддержки старых браузеров транспортер, например Babel), вы можете сделать следующее:

  1. Создайте файл settings.js с любыми необходимыми константами и экспортируйте их:
export const FRUIT = "kiwi";
export const VEGETABLE = "carrot";
  1. В файлах, которые вы хотите использовать, вы можете импортировать их следующим образом:
import * as Settings from './settings.js'
  1. Затем для использования констант сделайте что-то вроде этого:
console.log("The unchangeable fruit is " + Settings.FRUIT);

Это гораздо более чистый подход, чем попытка реализовать глобальную константу, особенно если у вас есть несколько файлов JavaScript, в которых вы хотите использовать константы.

3 голосов
/ 16 июня 2014

Если вы хотите убедиться, что значение не может измениться, используйте функцию.

Итак, вместо:

var Const_X=12

используйте:

function Const_X() {
return 12;
}
2 голосов
/ 17 октября 2018

Прямой ответ на этот вопрос - Нет. Это действительно помогло бы, если бы ECMA / JS нашел способ легко выполнять функциональное программирование. Работоспособный хак, который я использую, чтобы обойти это, состоит в том, чтобы объявить const в глобальной области видимости и использовать функцию-оболочку, см. Пример ниже:

:)

global_var = 3; //This can change say inside a function etc. but once you decide to make 
                //this global variable into a constant by calling on a function
const make_variable_constant = function(variable)
{
    const constant = variable;
    return constant;
}

const const_global = make_variable_constant(global_var);

:)

В далеком прошлом, когда объектно-ориентированное программирование было шумихой, ребёнок в моем классе сказал инструктору C, что C не является объектно-ориентированным, и, по словам преподавателя, он занимался объектно-ориентированным программированием на C еще до того, как были созданы Java и C ++. Точно так же вы можете заниматься функциональным программированием на Javascript, но это намного сложнее. Это все равно что делать объектно-ориентированное программирование на C, когда это легче делать на C ++.

...