利用try-catch判斷變量是已聲明未聲明還是未賦值
更新時(shí)間:2014年03月12日 16:49:49 作者:
這篇文章主要介紹了利用try-catch判斷變量是已聲明未賦值還是未聲明,需要的朋友可以參考下
目的是如果一個(gè)變量是已聲明未賦值,就可以直接賦值;并且不能改變變量的作用域
如果未聲明的話,就重新聲明,
在網(wǎng)上搜了下,常見的方法是if(typeof(a)=='undefined'){var a='ss';},
但是這種方法對未聲明或已聲明未賦值的變量都會(huì)返回true。而且如果是這樣:
var a;
function f(){
if(typeof(a)=='undefined')
{var a=1;}
}
f();
console.log(a);
會(huì)顯示undefined,因?yàn)閒()里面只是聲明了一個(gè)同名的局部變量。
但是如果是已聲明未賦值的變量:if(noValueV==null),會(huì)返回true;
未聲明的變量:if(noDeclareV==null),會(huì)報(bào)錯(cuò)。
所以可以這樣:
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)//說明v是已聲明未賦值
v=1; //如果v是全局變量,這樣不會(huì)改變它的作用域
}
catch(err){//說明v是未聲明
var v;v=2;
}
}
console.log(v);
}
f( );
這樣也是不對的,因?yàn)閖s有‘聲明提前'的特性,即函數(shù)內(nèi)聲明的變量在這個(gè)函數(shù)里和這個(gè)函數(shù)的子函數(shù)里都是可見的,不管它具體是在函數(shù)內(nèi)的哪個(gè)位置聲明的。
所以由于上面里的var v;導(dǎo)致不管哪種情況都是只走try。
修改一下:
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)//說明v是已聲明未賦值
v=1; //如果v是全局變量,這樣不會(huì)改變它的作用域
}
catch(err){//說明v是未聲明
eval('var v');v=2; //這里不一樣
}
}
console.log(v);
}
f( );
這樣就可以了。
寫成一個(gè)判斷函數(shù),返回'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));
又錯(cuò)了......console.log(f(b));時(shí)會(huì)報(bào)錯(cuò)......
如果未聲明的話,就重新聲明,
在網(wǎng)上搜了下,常見的方法是if(typeof(a)=='undefined'){var a='ss';},
但是這種方法對未聲明或已聲明未賦值的變量都會(huì)返回true。而且如果是這樣:
復(fù)制代碼 代碼如下:
var a;
function f(){
if(typeof(a)=='undefined')
{var a=1;}
}
f();
console.log(a);
會(huì)顯示undefined,因?yàn)閒()里面只是聲明了一個(gè)同名的局部變量。
但是如果是已聲明未賦值的變量:if(noValueV==null),會(huì)返回true;
未聲明的變量:if(noDeclareV==null),會(huì)報(bào)錯(cuò)。
所以可以這樣:
復(fù)制代碼 代碼如下:
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)//說明v是已聲明未賦值
v=1; //如果v是全局變量,這樣不會(huì)改變它的作用域
}
catch(err){//說明v是未聲明
var v;v=2;
}
}
console.log(v);
}
f( );
這樣也是不對的,因?yàn)閖s有‘聲明提前'的特性,即函數(shù)內(nèi)聲明的變量在這個(gè)函數(shù)里和這個(gè)函數(shù)的子函數(shù)里都是可見的,不管它具體是在函數(shù)內(nèi)的哪個(gè)位置聲明的。
所以由于上面里的var v;導(dǎo)致不管哪種情況都是只走try。
修改一下:
復(fù)制代碼 代碼如下:
function f( ){
if(typeof(v)=='undefined'){
try{
if(v==null)//說明v是已聲明未賦值
v=1; //如果v是全局變量,這樣不會(huì)改變它的作用域
}
catch(err){//說明v是未聲明
eval('var v');v=2; //這里不一樣
}
}
console.log(v);
}
f( );
這樣就可以了。
寫成一個(gè)判斷函數(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));
又錯(cuò)了......console.log(f(b));時(shí)會(huì)報(bào)錯(cuò)......
相關(guān)文章
js獲取元素到可視區(qū)的距離、瀏覽器窗口滾動(dòng)距離及元素距離瀏覽器頂部距離
這篇文章主要給大家介紹了關(guān)于js獲取元素到可視區(qū)的距離、瀏覽器窗口滾動(dòng)距離及元素距離瀏覽器頂部距離的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11詳解JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()
JS中有三種函數(shù)可以將非數(shù)值轉(zhuǎn)換成數(shù)值:Number()、parseInt()和parseFloat()。接下來通過本文詳細(xì)的給大家介紹JS轉(zhuǎn)換數(shù)值函數(shù)Number()、parseInt()、parseFloat()的實(shí)例代碼,感興趣的朋友一起看看吧2018-08-08SharePoint 客戶端對象模型 (一) ECMA Script
今天開始SharePoint Client對象模型的介紹,簡而言之,SharePoint通過WCF技術(shù)在服務(wù)端提供數(shù)據(jù)服務(wù),這些服務(wù)提供的內(nèi)容相當(dāng)于SharePoint API的一個(gè)子集2011-05-05js下將字符串當(dāng)函數(shù)執(zhí)行的方法
js下將字符串當(dāng)函數(shù)執(zhí)行的方法,需要的朋友可以參考下。2011-07-07我要點(diǎn)爆”微信小程序云開發(fā)之項(xiàng)目建立與我的頁面功能實(shí)現(xiàn)
這篇文章主要介紹了我要點(diǎn)爆”微信小程序云開發(fā)之項(xiàng)目建立與我的頁面功能實(shí)現(xiàn),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05