try-catchを利用して変数が宣言されていますか?それとも未割り当てですか?


目的は、変数が割り当てられていないと宣言されている場合、直接に値を割り当てることができます。また、変数の作用領域を変更できない場合は、改めて声明します。インターネットで検索すると、よくある方法はif(typeof(a)='undefined'){var a='ss'}です。しかし、この方法は宣言されていない変数や宣言されていない変数に対してtrueを返します。もしそうならば:
 
var a;
function f(){
if(typeof(a)=='undefined')
{var a=1;}
}
f();
console.log(a);
はundefinedを表示します。f()の中では同名の局所変数だけを宣言しています。但し、未割り当てを宣言した変数であれば、if(noValueV==null)はtrueに戻ります。未宣言の変数:if(noDeclareV==null)は、エラーとします。このようにすることができます。
 
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)// v
v=1; // v ,
}
catch(err){// v
var v;v=2;
}
}
console.log(v);
}
f( );
も違います。jsには「宣言前」の特性があります。すなわち関数内で宣言された変数はこの関数とこの関数のサブ関数で見られます。だから上のvar vです。どちらの場合もtryのみになります。ちょっと修正してください。
 
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)// v
v=1; // v ,
}
catch(err){// v
eval('var v');v=2; //
}
}
console.log(v);
}
f( );
これでいいです。判断関数を作成して、「noDeclare」に戻って変数未宣言を表します。「noValue」は変数が割り当てられていないと宣言しています。「hasValue」は変数が割り当てられたと宣言しました。
 
function f(v){
if(typeof(v)=='undefined'){
try{
if(v==null)
return 'noValue';
}
catch(err){
return 'noDeclare';
}
}
else return 'hasValue';
}
var a;
console.log(f(a));
a=0;
console.log(f(a));
console.log(f(b));
はまた間違っています。時報が間違っています