利用try-catch判斷變量是已聲明未聲明還是未賦值
更新時間:2014年03月12日 16:49:49 作者:
這篇文章主要介紹了利用try-catch判斷變量是已聲明未賦值還是未聲明,需要的朋友可以參考下
目的是如果一個變量是已聲明未賦值,就可以直接賦值;并且不能改變變量的作用域
如果未聲明的話,就重新聲明,
在網(wǎng)上搜了下,常見的方法是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有‘聲明提前'的特性,即函數(shù)內(nèi)聲明的變量在這個函數(shù)里和這個函數(shù)的子函數(shù)里都是可見的,不管它具體是在函數(shù)內(nèi)的哪個位置聲明的。
所以由于上面里的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( );
這樣就可以了。
寫成一個判斷函數(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));
又錯了......console.log(f(b));時會報錯......
如果未聲明的話,就重新聲明,
在網(wǎng)上搜了下,常見的方法是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有‘聲明提前'的特性,即函數(shù)內(nèi)聲明的變量在這個函數(shù)里和這個函數(shù)的子函數(shù)里都是可見的,不管它具體是在函數(shù)內(nèi)的哪個位置聲明的。
所以由于上面里的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( );
這樣就可以了。
寫成一個判斷函數(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));
又錯了......console.log(f(b));時會報錯......
相關文章
JavaScript類型檢測之typeof 和 instanceof 的缺陷與優(yōu)化
在javascript中,typeof 和 instanceof 是用來判斷數(shù)據(jù)類型比較通用的兩個方法,這篇文章的目的是通過對這兩個方法介紹來分析其存在的不足并提出優(yōu)化方案2016-01-01
JS?中的URLSearchParams?對象操作(以對象的形式上傳參數(shù)到url)
這篇文章主要介紹了JS中URLSearchParams的基本用法,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
使用openSpeDiv方法實現(xiàn)Ecshop登錄彈窗框效果
在ECSHOP的目錄/JS/common.js中有一個openSpeDiv方法是實現(xiàn)ECSHOP的彈窗效果的。接下來通過本文給大家分享使用openSpeDiv方法實現(xiàn)Ecshop登錄彈窗框效果,需要的朋友參考下2017-03-03
子窗口、父窗口和Silverlight之間的相互調(diào)用
前兩天做 silverlight 的東西,主頁面打開一個子頁面,然后子頁面中包含一個 silverlight 應用程序那難免會涉及到他們?nèi)呦嗷フ{(diào)用的問題2010-08-08
在iframe中使bootstrap的模態(tài)框在父頁面彈出問題
這篇文章主要介紹了在iframe中使bootstrap的模態(tài)框在父頁面彈出問題,解決方法非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-08-08

