Вопрос

Есть ли способ использовать константы в JavaScript?

Если нет, то какова обычная практика указания переменных, которые используются в качестве констант?

Это было полезно?

Решение

С тех пор как ES2015, в JavaScript есть понятие const:

const MY_CONSTANT = "some-value";

Это будет работать в практически во всех браузерах, кроме IE 8, 9 и 10.Некоторым также может понадобиться строгий режим включен.

Вы можете использовать var с такими соглашениями, как ALL_CAPS, чтобы показать, что определенные значения не следует изменять, если вам нужно поддерживать старые браузеры или вы работаете с устаревшим кодом:

var MY_CONSTANT = "some-value";

Другие советы

Вы пытаетесь защитить переменные от изменения?Если это так, то вы можете использовать шаблон модуля:

var CONFIG = (function() {
     var private = {
         'MY_CONST': '1',
         'ANOTHER_CONST': '2'
     };

     return {
        get: function(name) { return private[name]; }
    };
})();

alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.private.MY_CONST = '2';                 // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

Используя такой подход, значения не могут быть изменены.Но вы должны использовать метод get() в КОНФИГУРАЦИИ :(.

Если вам не нужно строго защищать значение переменных, то просто сделайте, как предложено, и используйте соглашение о ВСЕХ ЗАГЛАВНЫХ буквах.

Тот Самый const ключевое слово находится в проект ECMAScript 6 но пока он пользуется лишь незначительной поддержкой браузера: http://kangax.github.io/compat-table/es6/.Синтаксис таков:

const CONSTANT_NAME = 0;
"use strict";

var constants = Object.freeze({
    "π": 3.141592653589793 ,
    "e": 2.718281828459045 ,
    "i": Math.sqrt(-1)
});

constants.π;        // -> 3.141592653589793
constants.π = 3;    // -> TypeError: Cannot assign to read only property 'π' …
constants.π;        // -> 3.141592653589793

delete constants.π; // -> TypeError: Unable to delete property.
constants.π;        // -> 3.141592653589793

Видишь Объект.заморозить.Ты можешь использование const если вы хотите сделать constants ссылка также доступна только для чтения.

IE поддерживает константы, вроде как, например:

<script language="VBScript">
 Const IE_CONST = True
</script>
<script type="text/javascript">
 if (typeof TEST_CONST == 'undefined') {
    const IE_CONST = false;
 }
 alert(IE_CONST);
</script>

ECMAScript 5 действительно вводит Object.defineProperty:

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

Это поддерживается в каждом современном браузере (а также IE ≥ 9).

Смотрите также: Object.defineProperty в ES5?

Нет, не в целом.Firefox реализует const но я знаю, что IE этого не делает.


@Джон указывает на распространенную практику именования consts, которая годами использовалась на других языках, я не вижу причин, по которым вы не могли бы это использовать.Конечно, это не означает, что кто-то все равно не будет переписывать значение переменной.:)

Mozillas MDN Веб-документы содержат наглядные примеры и пояснения о const.Отрывок:

// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;

// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

Но печально, что IE9 / 10 по-прежнему не поддерживает const.И причина этого в том, что абсурдно:

Итак, что IE9 делает с const?Итак, пока что нашим решением было не поддерживать это.Это еще не согласовано функция, поскольку она никогда не была доступна во всех браузерах.

...

В конце концов, кажется, что лучшее долгосрочное решение для Интернета - это оставить это и подождать, пока процессы стандартизации пройдут своим чередом.

Они не реализуют это, потому что другие браузеры не реализовали это правильно?!Слишком боишься сделать это лучше?Определения стандартов или нет, константа есть константа:установлен один раз, никогда не менялся.

И ко всем этим идеям:Каждая функция может быть перезаписана (XSS и т.д.).Таким образом, нет никакой разницы в var или function(){return}. const это единственная реальная константа.

Обновить:IE11 поддерживает const:

IE11 включает поддержку четко определенных и часто используемых функций нового стандарта ECMAScript 6, включая let, const, Map, Set, и WeakMap, а также __proto__ для улучшения взаимодействия.

В JavaScript я предпочитаю использовать функции для возврата постоянных значений.

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());

Если вы не возражаете против использования функций:

var constant = function(val) {
   return function() {
        return val;
    }
}

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

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

Лично я нахожу это довольно приятным, особенно после того, как привык к этому шаблону из knockout observables.

* Если только кто-то не переопределил эту функцию constant до того, как ты это назвал

с помощью "нового" объектного API вы можете сделать что-то вроде этого:

var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
  configurable: false
  enumerable: true,
  writable: false,
  value: "your constant value"
});

взгляните на это более подробную информацию можно найти в Mozilla MDN.Это не переменная первого уровня, поскольку она привязана к объекту, но если у вас есть область видимости, что угодно, вы можете привязать это к ней. this должно сработать так же хорошо.Так, например, выполнение этого в глобальной области видимости приведет к объявлению псевдопостоянного значения в окне (что действительно плохая идея, вы не должны небрежно объявлять глобальные переменные)

Object.defineProperty(this, 'constant', {
  enumerable: true, 
  writable: false, 
  value: 7, 
  configurable: false
});

> constant
=> 7
> constant = 5
=> 7

примечание:присваивание вернет вам присвоенное значение в консоли, но значение переменной не изменится

Группируйте константы в структуры, где это возможно:

Пример, в моем текущем игровом проекте, я использовал ниже:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

Назначение:

var wildType = CONST_WILD_TYPES.REGULAR;

Сравнение:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

Совсем недавно я использую, для сравнения:

switch (wildType) {
    case CONST_WILD_TYPES.REGULAR:
        // do something here
        break;
    case CONST_WILD_TYPES.EXPANDING:
        // do something here
        break;
}

IE11 соответствует новому стандарту ES6, который имеет объявление 'const'.
Вышеописанное работает в более ранних браузерах, таких как IE8, IE9 и IE10.

Вы можете легко снабдить свой скрипт механизмом для констант, которые можно устанавливать, но не изменять.Попытка изменить их приведет к появлению ошибки.

/* author Keith Evetts 2009 License: LGPL  
anonymous function sets up:  
global function SETCONST (String name, mixed value)  
global function CONST (String name)  
constants once set may not be altered - console error is generated  
they are retrieved as CONST(name)  
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided  
*/

(function(){  
  var constants = {};  
  self.SETCONST = function(name,value) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if (!value) { throw new Error(' no value supplied for constant ' + name); }  
      else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }   
      else {   
          constants[name] = value;   
          return true;  
    }    
  };  
  self.CONST = function(name) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if ( name in constants ) { return constants[name]; }    
      else { throw new Error('constant ' + name + ' has not been defined'); }  
  };  
}())  


// -------------  demo ----------------------------  
SETCONST( 'VAT', 0.175 );  
alert( CONST('VAT') );


//try to alter the value of VAT  
try{  
  SETCONST( 'VAT', 0.22 );  
} catch ( exc )  {  
   alert (exc.message);  
}  
//check old value of VAT remains  
alert( CONST('VAT') );  


// try to get at constants object directly  
constants['DODO'] = "dead bird";  // error  

Забудьте о IE и используйте const ключевое слово.

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

Но я предложу использовать пространство имен для отличия от других переменных.это сведет к минимуму вероятность столкновения с другими переменными.

Правильное пространство имен, например

var iw_constant={
     name:'sudhanshu',
     age:'23'
     //all varibale come like this
}

таким образом, при использовании это будет iw_constant.name или iw_constant.age

Вы также можете заблокировать добавление любого нового ключа или изменение любого ключа внутри iw_constant, используя метод Object.freeze.Однако он не поддерживается в устаревшем браузере.

бывший:

Object.freeze(iw_constant);

Для более старого браузера вы можете использовать полифилл для метода замораживания.


Если вы согласны с вызовом функции, ниже приведен лучший кроссбраузерный способ определения константы.Определение области действия вашего объекта в рамках самоисполняющейся функции и возврат функции get для ваших констант пример:

var iw_constant= (function(){
       var allConstant={
             name:'sudhanshu',
             age:'23'
             //all varibale come like this

       };

       return function(key){
          allConstant[key];
       }
    };

//чтобы получить значение, используйте iw_constant('name') или iw_constant('age')


** В обоих примерах вы должны быть очень осторожны с интервалом между именами, чтобы ваш объект или функция не были заменены с помощью другой библиотеки.(Если сам объект или функция будут заменены, вся ваша константа исчезнет)

Некоторое время я указывал "константы" (которые на самом деле все еще не были константами) в объектных литералах, передаваемых через with() заявления.Я думал, это было так умно.Вот пример:

with ({
    MY_CONST : 'some really important value'
}) {
    alert(MY_CONST);
}

В прошлом я также создавал CONST пространство имен, куда я бы поместил все свои константы.Опять же, с накладными расходами.Блин.

Теперь я просто делаю var MY_CONST = 'whatever'; Для ПОЦЕЛУЙ.

Мое мнение (работает только с объектами).

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

Попробуй!Но поймите - это объект, а не простая переменная.

Попробуйте также просто:

const a = 9;

У меня тоже были проблемы с этим.И после довольно продолжительных поисков ответа и рассмотрения всех ответов, я думаю, что нашел жизнеспособное решение этой проблемы.

Похоже, что большинство ответов, с которыми я сталкивался, связаны с использованием функций для хранения констант.Как пишут многие пользователи на МНОГОЧИСЛЕННЫХ форумах, функции могут быть легко переписаны пользователями на стороне клиента.Я был заинтригован ответом Кита Эветтса о том, что к объекту constants нельзя получить доступ извне, а только из функций внутри.

Итак, я пришел к этому решению:

Поместите все таким образом внутрь анонимной функции - переменные, объекты и т.д.не может быть изменен клиентской стороной.Также скройте "реальные" функции, заставив другие функции вызывать "реальные" функции изнутри.Я также подумал об использовании функций, чтобы проверить, была ли функция изменена пользователем на стороне клиента.Если функции были изменены, измените их обратно, используя переменные, которые "защищены" изнутри и не могут быть изменены.

/*Tested in: IE 9.0.8; Firefox 14.0.1; Chrome 20.0.1180.60 m; Not Tested in Safari*/

(function(){
  /*The two functions _define and _access are from Keith Evetts 2009 License: LGPL (SETCONST and CONST).
    They're the same just as he did them, the only things I changed are the variable names and the text
    of the error messages.
  */

  //object literal to hold the constants
  var j = {};

  /*Global function _define(String h, mixed m). I named it define to mimic the way PHP 'defines' constants.
    The argument 'h' is the name of the const and has to be a string, 'm' is the value of the const and has
    to exist. If there is already a property with the same name in the object holder, then we throw an error.
    If not, we add the property and set the value to it. This is a 'hidden' function and the user doesn't
    see any of your coding call this function. You call the _makeDef() in your code and that function calls
    this function.    -    You can change the error messages to whatever you want them to say.
  */
  self._define = function(h,m) {
      if (typeof h !== 'string') { throw new Error('I don\'t know what to do.'); }
      if (!m) { throw new Error('I don\'t know what to do.'); }
      else if ((h in j) ) { throw new Error('We have a problem!'); }
      else {
          j[h] = m;
          return true;
    }
  };

  /*Global function _makeDef(String t, mixed y). I named it makeDef because we 'make the define' with this
    function. The argument 't' is the name of the const and doesn't need to be all caps because I set it
    to upper case within the function, 'y' is the value of the value of the const and has to exist. I
    make different variables to make it harder for a user to figure out whats going on. We then call the
    _define function with the two new variables. You call this function in your code to set the constant.
    You can change the error message to whatever you want it to say.
  */
  self._makeDef = function(t, y) {
      if(!y) { throw new Error('I don\'t know what to do.'); return false; }
      q = t.toUpperCase();
      w = y;
      _define(q, w);
  };

  /*Global function _getDef(String s). I named it getDef because we 'get the define' with this function. The
    argument 's' is the name of the const and doesn't need to be all capse because I set it to upper case
    within the function. I make a different variable to make it harder for a user to figure out whats going
    on. The function returns the _access function call. I pass the new variable and the original string
    along to the _access function. I do this because if a user is trying to get the value of something, if
    there is an error the argument doesn't get displayed with upper case in the error message. You call this
    function in your code to get the constant.
  */
  self._getDef = function(s) {
      z = s.toUpperCase();
      return _access(z, s);
  };

  /*Global function _access(String g, String f). I named it access because we 'access' the constant through
    this function. The argument 'g' is the name of the const and its all upper case, 'f' is also the name
    of the const, but its the original string that was passed to the _getDef() function. If there is an
    error, the original string, 'f', is displayed. This makes it harder for a user to figure out how the
    constants are being stored. If there is a property with the same name in the object holder, we return
    the constant value. If not, we check if the 'f' variable exists, if not, set it to the value of 'g' and
    throw an error. This is a 'hidden' function and the user doesn't see any of your coding call this
    function. You call the _getDef() function in your code and that function calls this function.
    You can change the error messages to whatever you want them to say.
  */
  self._access = function(g, f) {
      if (typeof g !== 'string') { throw new Error('I don\'t know what to do.'); }
      if ( g in j ) { return j[g]; }
      else { if(!f) { f = g; } throw new Error('I don\'t know what to do. I have no idea what \''+f+'\' is.'); }
  };

  /*The four variables below are private and cannot be accessed from the outside script except for the
    functions inside this anonymous function. These variables are strings of the four above functions and
    will be used by the all-dreaded eval() function to set them back to their original if any of them should
    be changed by a user trying to hack your code.
  */
  var _define_func_string = "function(h,m) {"+"      if (typeof h !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if (!m) { throw new Error('I don\\'t know what to do.'); }"+"      else if ((h in j) ) { throw new Error('We have a problem!'); }"+"      else {"+"          j[h] = m;"+"          return true;"+"    }"+"  }";
  var _makeDef_func_string = "function(t, y) {"+"      if(!y) { throw new Error('I don\\'t know what to do.'); return false; }"+"      q = t.toUpperCase();"+"      w = y;"+"      _define(q, w);"+"  }";
  var _getDef_func_string = "function(s) {"+"      z = s.toUpperCase();"+"      return _access(z, s);"+"  }";
  var _access_func_string = "function(g, f) {"+"      if (typeof g !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if ( g in j ) { return j[g]; }"+"      else { if(!f) { f = g; } throw new Error('I don\\'t know what to do. I have no idea what \\''+f+'\\' is.'); }"+"  }";

  /*Global function _doFunctionCheck(String u). I named it doFunctionCheck because we're 'checking the functions'
    The argument 'u' is the name of any of the four above function names you want to check. This function will
    check if a specific line of code is inside a given function. If it is, then we do nothing, if not, then
    we use the eval() function to set the function back to its original coding using the function string
    variables above. This function will also throw an error depending upon the doError variable being set to true
    This is a 'hidden' function and the user doesn't see any of your coding call this function. You call the
    doCodeCheck() function and that function calls this function.    -    You can change the error messages to
    whatever you want them to say.
  */
  self._doFunctionCheck = function(u) {
      var errMsg = 'We have a BIG problem! You\'ve changed my code.';
      var doError = true;
      d = u;
      switch(d.toLowerCase())
      {
           case "_getdef":
               if(_getDef.toString().indexOf("z = s.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_getDef = "+_getDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_makedef":
               if(_makeDef.toString().indexOf("q = t.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_makeDef = "+_makeDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_define":
               if(_define.toString().indexOf("else if((h in j) ) {") != -1) { /*do nothing*/ }
               else { eval("_define = "+_define_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_access":
               if(_access.toString().indexOf("else { if(!f) { f = g; }") != -1) { /*do nothing*/ }
               else { eval("_access = "+_access_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           default:
                if(doError === true) { throw new Error('I don\'t know what to do.'); }
      }
  };

  /*Global function _doCodeCheck(String v). I named it doCodeCheck because we're 'doing a code check'. The argument
    'v' is the name of one of the first four functions in this script that you want to check. I make a different
    variable to make it harder for a user to figure out whats going on. You call this function in your code to check
    if any of the functions has been changed by the user.
  */
  self._doCodeCheck = function(v) {
      l = v;
      _doFunctionCheck(l);
  };
}())

Также кажется, что безопасность действительно является проблемой, и нет способа "скрыть" ваше программирование со стороны клиента.Хорошая идея для меня - сжать ваш код так, чтобы кому-либо, включая вас, программиста, было действительно трудно его прочитать и понять.Есть сайт, на который вы можете зайти: http://javascriptcompressor.com/.(Это не мой сайт, не волнуйтесь, я не рекламирую.) Это сайт, который позволит вам бесплатно сжимать и запутывать код Javascript.

  1. Скопируйте весь код из приведенного выше скрипта и вставьте его в верхнюю текстовую область на странице javascriptcompressor.com.
  2. Установите флажок Кодировать Base62, установите флажок Сжимать переменные.
  3. Нажмите кнопку Сжатия.
  4. Вставьте и сохраните все это в js-файл и добавьте на свою страницу в начале страницы.

Ясно, что это показывает необходимость использования стандартизированного кроссбраузерного ключевого слова const.

Но на данный момент:

var myconst = value;

или

Object['myconst'] = value;

И того, и другого кажется достаточным, а все остальное - все равно что стрелять в муху из базуки.

Я использую const вместо того, чтобы var в моих скриптах Greasemonkey, но это потому, что они будут запускаться только в Firefox...
Соглашение об именах тоже может быть правильным решением (я делаю и то, и другое!).

В JavaScript моя практика заключалась в том, чтобы по возможности избегать констант и использовать вместо них строки.Проблемы с константами возникают, когда вы хотите показать свои константы внешнему миру:

Например, можно было бы реализовать следующий Date API:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

Но гораздо короче и естественнее просто написать:

date.add(5, "days").add(12, "hours")

Таким образом, "дни" и "часы" действительно действуют как константы, потому что вы не можете изменить извне, сколько секунд представляет "часы".Но это легко переписать MyModule.Date.HOUR.

Такой подход также поможет в отладке.Если Firebug скажет вам action === 18 довольно трудно понять, что это значит, но когда вы видите action === "save" тогда все сразу становится ясно.

Ладно, это некрасиво, но это дает мне константу в Firefox и Chromium, непостоянную константу (WTF?) в Safari и Opera и переменную в IE.

Конечно, eval() - это зло, но без него IE выдает ошибку, препятствующую запуску скриптов.

Safari и Opera поддерживают ключевое слово const, но вы можете изменить значение const.

В этом примере серверный код записывает JavaScript на страницу, заменяя {0} значением.

try{
    // i can haz const?
    eval("const FOO='{0}';");
    // for reals?
    var original=FOO;
    try{
        FOO='?NO!';
    }catch(err1){
        // no err from Firefox/Chrome - fails silently
        alert('err1 '+err1);
    }
    alert('const '+FOO);
    if(FOO=='?NO!'){
        // changed in Sf/Op - set back to original value
        FOO=original;
    }
}catch(err2){
    // IE fail
    alert('err2 '+err2);
    // set var (no var keyword - Chrome/Firefox complain about redefining const)
    FOO='{0}';
    alert('var '+FOO);
}
alert('FOO '+FOO);

Для чего это нужно?Не так уж много, поскольку он не является кроссбраузерным.В лучшем случае, может быть, немного душевного спокойствия, которое, по крайней мере некоторые браузеры не позволяют букмарклетам или сторонним скриптам изменять это значение.

Тестировался с Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.

Если это стоит упомянуть, вы можете определить константы в угловатый используя $provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');

Улучшенная версия Ответ Берка это позволяет вам делать CONFIG.MY_CONST вместо того, чтобы CONFIG.get('MY_CONST').

Для этого требуется IE9 + или настоящий веб-браузер.

var CONFIG = (function() {
    var constants = {
        'MY_CONST': 1,
        'ANOTHER_CONST': 2
    };

    var result = {};
    for (var n in constants)
        if (constants.hasOwnProperty(n))
            Object.defineProperty(result, n, { value: constants[n] });

    return result;
}());

* Свойства доступны только для чтения, только если начальные значения неизменяемы.

JavaScript ES6 (повторно) представил const ключевое слово который поддерживается в все основные браузеры.

Переменные, объявленные через const не может быть повторно объявлен или переназначен.

Помимо этого, const ведет себя аналогично let.

Он ведет себя так, как ожидалось для примитивных типов данных (Boolean, Null, Undefined, Число, Строка, Символ).:

const x = 1;
x = 2;
console.log(x); // 1 ...as expected, re-assigning fails

Внимание: Будьте осведомлены о подводных камнях, связанных с объектами:

const o = {x: 1};
o = {x: 2};
console.log(o); // {x: 1} ...as expected, re-assigning fails

o.x = 2;
console.log(o); // {x: 2} !!! const does not make objects immutable!

const a = [];
a = [1];
console.log(a); // 1 ...as expected, re-assigning fails

a.push(1);
console.log(a); // [1] !!! const does not make objects immutable

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

Другой альтернативой является что-то вроде:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

Тогда просто: var foo = constantMap.MY_CONSTANT

Если бы вы захотели constantMap.MY_CONSTANT = "bar" это не имело бы никакого эффекта, поскольку мы пытаемся использовать оператор присваивания с геттером, следовательно constantMap.MY_CONSTANT === "myconstant" оставалось бы верным.

в Javascript уже существует константы.Вы определяете константу следующим образом:

const name1 = value;

Это не может быть изменено путем переназначения.

Ключевое слово "const" было предложено ранее, и теперь оно официально включено в ES6.Используя ключевое слово const, вы можете передать значение / строку, которая будет действовать как неизменяемая строка.

Введение констант в JavaScript - это в лучшем случае взлом.

Хорошим способом создания постоянных и глобально доступных значений в JavaScript было бы объявление объектного литерала с некоторыми свойствами "только для чтения", подобными этому:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

у вас будут все ваши константы, сгруппированные в один вспомогательный объект "my", где вы сможете искать свои сохраненные значения или что-либо еще, что вы, возможно, решили поместить туда по этому поводу.Теперь давайте проверим, работает ли это:

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

Как мы можем видеть, свойство "my.constant1" сохранило свое первоначальное значение.Вы создали себе несколько приятных "зеленых" временных констант...

Но, конечно, это только защитит вас от случайного изменения, аннулирования или опустошения значения константы вашего свойства с прямым доступом, как в приведенном примере.

В противном случае я все еще думаю, что константы предназначены для чайников.И я все еще думаю, что обменять свою великую свободу на маленький уголок обманчивой безопасности - наихудшая сделка из всех возможных.

Rhino.js орудия труда const в дополнение к тому, что было упомянуто выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top