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はブロックスコープになります。
では、定数を条件付きで作成する方法は?
あなたが知っているように、あなたの問題は、const
が宣言されたのと同じステートメントで初期化されなければならないことです。
これは、定数に割り当てる値がリテラル値である必要があるという意味ではありません。それは本当に有効なステートメントである可能性があります-三項:
const x = IsSomeValueTrue() ? 1 : 2;
または、単に変数の値に割り当てますか?
let y = 1;
if(IsSomeValueTrue()) {
y = 2;
}
const x = y;
もちろん、それを関数の戻り値に割り当てることもできます。
function getConstantValue() {
return 3;
}
const x = getConstantValue();
したがって、値を動的にする方法はたくさんあります。1つの場所にのみ割り当てられるようにする必要があります。
三項演算子が読みにくいオプションではない場合、他のオプションはIIFEのみです。これは扱いにくいですが、流fluentに読むことができます。
const x = (() => {
if (condition)
return 5
else
return 10
})();
const
のセマンティクスは、一度割り当てられることです。このユースケースでは、let
である必要があります。
let x;
if(condition) x = 5;
else x = 10;
私の個人的な経験から、変数の〜95%はconst
です。変数をlet
にする必要がある場合は、それ自体をそのままにします。偶発的な再割り当てによって引き起こされるバグの可能性は無視できます。
const
がbothインスタンスで宣言されると仮定すると、3項代入を使用できます。
const x = condition ? 5 : 10;
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();