是否可以使用闭包在Javascript中模拟常量?

时间:2009-03-08 02:23:45

标签: javascript closures constants

是否可以使用闭包在Javascript中模拟常量?如果是的话,你能告诉我一个例子吗?

4 个答案:

答案 0 :(得分:6)

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;

“模拟”常量的另一个选择是使用某些浏览器中可用的property definition functionality来定义对象的只读属性。当然,由于支持属性定义的浏览器不包含IE,这实际上没有帮助......(注意IE 8 确实支持属性定义after a fashion ...但不是在JavaScript对象上)

最后,在非常设计的场景中,您可以使用函数参数作为常量(也许这是您在建议闭包时所考虑的内容?)。虽然它们表现为变量,但它们仍然限定在定义它们的函数中,因此不能影响由修改它们的函数之外的同名变量所持有的值:

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

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

请注意,与此类似的是commonly used by jQuery plugins,但出于相反的原因:jQuery代码通常使用$简写来引用jQuery对象,但该库旨在继续工作即使其他一些代码重新定义了该符号;通过将库和插件代码包含在带有$参数的匿名函数中,然后传入jQuery作为参数,代码与其他库可能对$的值进行的更改隔离开来上。


另见:Are there constants in Javascript?

答案 1 :(得分:2)

您可以使用const keywordImplemented in JavaScript 1.5)创建只读的命名常量。

答案 2 :(得分:0)

这是我得到的:

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

这种方法允许我通过扩展对象文字扩展范围,使其具有多个常量成员变量。

答案 3 :(得分:0)

要声明:

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

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

var globalConstants=globals();

要访问:

globalConstants.getX1();