利用try-catch判斷變數是已聲明未聲明還是未賦值

來源:互聯網
上載者:User

目的是如果一個變數是已聲明未賦值,就可以直接賦值;並且不能改變變數的範圍

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

在網上搜了下,常見的方法是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));

又錯了......console.log(f(b));時會報錯......

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.