Можно ли симулировать константы в Javascript с помощью замыканий? - PullRequest
0 голосов
/ 08 марта 2009

Можно ли симулировать константы в Javascript с помощью замыканий? Если да, не могли бы вы дать мне пример?

Ответы [ 4 ]

6 голосов
/ 08 марта 2009

Firefox и Chrome поддерживают ключевое слово const. IE нет. Так что если вам нужны константы и вам не нужна поддержка IE, const не плохой выбор. Имейте в виду, однако, что ни один браузер не выдает ошибку времени выполнения, когда значение присваивается const; значения просто остаются неизменными.

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

function PI() { return 3.14159; }

var area = radius*radius * PI();

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

// note to self: never assign values to variables utilizing all-uppercase name
var PI = 3.14159;

Другим вариантом «симуляции» констант может быть использование функциональности определения свойств , доступной в некоторых браузерах, для определения свойств объекта, доступных только для чтения. Разумеется, поскольку браузеры, поддерживающие определения свойств, не включают IE, это не очень помогает ... (обратите внимание, что IE 8 поддерживает определения свойств после способа .. . но не на объектах JavaScript)

Наконец, в очень вымышленных сценариях вы можете использовать аргументы функций в качестве констант (возможно, именно об этом вы и думали, когда предлагали замыкания?). Хотя они ведут себя как переменные, они остаются в области действия функции, в которой они определены, и поэтому не могут влиять на значения, содержащиеся в переменных с одинаковым именем вне функции, в которой они изменены:

var blah = 3;
var naw = "nope";
(function(blah, naw)
{
  blah = 2;
  naw = "yeah";
  alert(naw + blah); // "yeah2"
})(blah, naw);

alert(naw + blah); // "nope3"

Обратите внимание, что что-то похожее на это , обычно используемое плагинами jQuery , но по противоположной причине: код jQuery обычно пишется с использованием сокращения $ для ссылки на объект jQuery, но библиотека намеревался продолжать работать, даже если какой-то другой код переопределяет этот символ; Оборачивая код библиотеки и плагина в анонимные функции с параметром $, а затем передавая jQuery в качестве аргумента, код изолируется от изменений, которые другие библиотеки могут внести в значение $ позже.


См. Также: Есть ли константы в Javascript?

2 голосов
/ 08 марта 2009

Вы можете создавать именованные константы только для чтения с ключевым словом const ( Реализовано в JavaScript 1.5 ).

0 голосов
/ 29 октября 2018

Для объявления:

function globals(){
    const x1="something";
    const x2="otherthing";

    return{
      getX1=function(){
        return x1;
      },
      getX2=function(){
        return x2;
      }
    }
 }

var globalConstants=globals();

Для доступа:

globalConstants.getX1();
0 голосов
/ 09 марта 2009

Это насколько я получил:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script type="text/javascript">
            function Scope()
            {
                return function()
                {
                    return {Constant: 1}; //Object literal
                };
            }
            var Scope = Scope();
        </script>
    </head>
    <body>
        <script type="text/javascript">
            document.write(Scope().Constant + "<br />");

            //The following line of code has no effect and fails silently.
            Scope().Constant = 6;

            document.write(Scope().Constant + "<br />");
        </script>
    </body>
</html>

Этот подход позволяет мне расширить область действия, чтобы иметь более одной постоянной переменной-члена, расширяя литерал объекта.

...