Pergunta

É possível simular constantes em JavaScript usando fechamentos? Se assim for, você pode por favor me fornecesse um exemplo?

Foi útil?

Solução

O Firefox e Chrome ambos suportam o const palavra-chave. IE não. Então, se você precisa de constantes e não é necessário para suportar o IE, const não é uma má escolha. Tenha em mente, porém, nem navegador produz um erro de execução quando um valor é atribuído a uma const; os valores meramente permanece inalterado.

Caso contrário, você deve usar funções para definir constantes que não podem ser modificados:

function PI() { return 3.14159; }

var area = radius*radius * PI();

Claro, você pode codificar apenas escrever que nunca se modifica certas variáveis, e talvez estabelecer um esquema de nomes para essas variáveis, que você reconhece que eles nunca terá de ser modificado ...

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

Outra opção para "simulando" constantes seria usar o href="http://ejohn.org/blog/javascript-getters-and-setters/" rel="nofollow noreferrer"> funcionalidade definição de propriedade disponível em alguns browsers para definir propriedades em um objeto somente leitura. Claro, desde que os navegadores suportam definições de propriedade não incluem IE, que realmente não ajuda ... (note que o IE 8 faz definições de propriedade apoio depois de um moda ... mas não em objetos JavaScript)

Finalmente, em muito cenários artificiais que você pode usar argumentos de função como constantes (talvez isso é o que você estava pensando quando você sugeriu fechamentos?). Enquanto eles se comportam como variáveis, eles permanecem escopo para a função em que são definidos e não pode, portanto, afetar os valores mantidos por variáveis ??com o mesmo nome fora da função em que são modificados:

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

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

Note-se que algo semelhante a este é comumente usado por jQuery plugins , mas para pela razão oposta: código jQuery é geralmente escrito usando a abreviação $ para se referir ao objeto jQuery, mas a biblioteca é destinada a continuar a trabalhar mesmo que alguns outros redefine código que o símbolo; pela biblioteca de acondicionamento e código do plugin em funções anônimas com um parâmetro $ e depois passando em jQuery como um argumento, o código é isolado a partir de mudanças outras bibliotecas pode fazer para o valor de $ mais tarde.


Veja também: Existem constantes em Javascript

Outras dicas

Você pode criar somente leitura, constantes nomeadas com o const palavra-chave ( Implementado em JavaScript 1.5 ).

Esta é, tanto quanto eu tenho:

<!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>

Esta abordagem me permite alargar o âmbito para ter mais de uma variável membro constante, estendendo o objeto literal.

Para declarar:

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

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

var globalConstants=globals();

Para acessar:

globalConstants.getX1();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top