ES6以后我们有const
。
这是不允许的:
const x; //declare first
//and then initialize it
if(condition) x = 5;
else x = 10;
这是有道理的,因为它阻止我们在它被初始化之前使用常量。
但如果我这样做
if(condition)
const x = 5;
else
const x = 10;
x成为块范围。
那么如何有条件地创建一个常量?
答案 0 :(得分:22)
正如您所知,您的问题是const
必须在声明它的同一语句中初始化。
这并不意味着您为常量赋值必须是文字值。它可能是任何有效的陈述 - 三元:
const x = IsSomeValueTrue() ? 1 : 2;
或者只是将其分配给变量的值?
let y = 1;
if(IsSomeValueTrue()) {
y = 2;
}
const x = y;
您当然也可以将其分配给函数的返回值:
function getConstantValue() {
return 3;
}
const x = getConstantValue();
因此,有很多方法可以使价值变得动态,你只需要确保它只在一个地方分配。
答案 1 :(得分:13)
如果三元运算符不是其不可读性的选项,那么唯一的另一种选择是IIFE,这很麻烦,但可以流利地阅读:
const x = (() => {
if (condition)
return 5
else
return 10
})();
const
的语义是它被分配一次。对于此用例,它应为let
:
let x;
if(condition) x = 5;
else x = 10;
根据我个人的经验,~95%的变数是const
。如果一个变量必须是let
,那就让它自己吧;意外重新分配造成的错误概率可以忽略不计。
答案 2 :(得分:4)
假设{<1}}将在两个实例中声明,您可以使用三元分配:
const
答案 3 :(得分:0)
我建议使用Singleton Pattern实现此解决方案:
var Singleton = (function () {
var instance;
function createInstance() {
// all your logic here
// so based on your example:
// if(condition) return 5;
// else return 10;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const x = Singleton.getInstance();