首頁 > web前端 > js教程 > 主體

利用try-catch判斷變數是已宣告未宣告還是未賦值_javascript技巧

WBOY
發布: 2016-05-16 16:55:39
原創
1120 人瀏覽過

目的是如果一個變數是已宣告未賦值,就可以直接賦值;並且不能改變變數的作用域

如果未聲明的話,就重新聲明,

在網路上搜了下,常見的方法是if(typeof(a)=='undefined'){var a='ss';},

但是這種方法對未宣告或已宣告未賦值的變數都會傳回true。而且如果是這樣:

複製程式碼 程式碼如下:

var a
;
; f(){
if(typeof(a)=='undefined')
{var a=1;}
}
f();
console.log(a);


會顯示undefined,因為f()裡面只是宣告了一個同名的局部變數。

但是如果是已宣告未賦值的變數:if(noValueV==null),會傳回true;

未宣告的變數:if(noDeclareV==null),會報錯。

所以可以這樣: 程式碼如下: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。

修改一下:


複製程式碼 程式碼如下: 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));


又錯了......console.log(f(b));時會報錯... ……
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板