是否可以使用闭包模拟 Javascript 中的常量?如果是这样,你能给我举个例子吗?
4 回答
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 中有常量吗?
您可以使用const 关键字(在 JavaScript 1.5 中实现)创建只读的命名常量。
这是据我所知:
<!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>
这种方法允许我通过扩展对象字面量来扩展范围以拥有多个常量成员变量。
声明 :
function globals(){
const x1="something";
const x2="otherthing";
return{
getX1=function(){
return x1;
},
getX2=function(){
return x2;
}
}
}
var globalConstants=globals();
访问:
globalConstants.getX1();