国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:02:43
字體:
供稿:網(wǎng)友
這篇文章主要介紹了利用try-catch判斷變量是已聲明未賦值還是未聲明,需要的朋友可以參考下

目的是如果一個變量是已聲明未賦值,就可以直接賦值;并且不能改變變量的作用域

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

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

但是這種方法對未聲明或已聲明未賦值的變量都會返回true。而且如果是這樣:

復(fù)制代碼 代碼如下:


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


會顯示undefined,因為f()里面只是聲明了一個同名的局部變量。

但是如果是已聲明未賦值的變量:if(noValueV==null),會返回true;

未聲明的變量:if(noDeclareV==null),會報錯。

所以可以這樣:

復(fù)制代碼 代碼如下:


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有‘聲明提前'的特性,即函數(shù)內(nèi)聲明的變量在這個函數(shù)里和這個函數(shù)的子函數(shù)里都是可見的,不管它具體是在函數(shù)內(nèi)的哪個位置聲明的。

所以由于上面里的var v;導(dǎo)致不管哪種情況都是只走try。

修改一下:

復(fù)制代碼 代碼如下:


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( );


這樣就可以了。

寫成一個判斷函數(shù),返回'noDeclare'表示變量未聲明,'noValue'表示變量已聲明未賦值,'hasValue'表示變量已聲明已賦值:

復(fù)制代碼 代碼如下:


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));時會報錯......
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 教育| 鄂伦春自治旗| 灵山县| 宁武县| 广昌县| 博客| 云南省| 八宿县| 关岭| 浦城县| 綦江县| 定日县| 梁山县| 江口县| 九龙城区| 兴隆县| 城步| 巨鹿县| 泾阳县| 襄垣县| 东明县| 民和| 永定县| 云浮市| 穆棱市| 华阴市| 阳高县| 澳门| 阳江市| 兰溪市| 盐亭县| 蕉岭县| 阆中市| 监利县| 响水县| 榕江县| 孝义市| 陆良县| 西安市| 西安市| 石景山区|