是否可以使用闭包在Javascript中模拟常量?如果是的话,你能告诉我一个例子吗?
答案 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
作为参数,代码与其他库可能对$
的值进行的更改隔离开来上。
答案 1 :(得分:2)
您可以使用const keyword(Implemented 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();