利用try-catch判断变量是已声明未声明还是未赋值

简介: 原文 利用try-catch判断变量是已声明未声明还是未赋值 这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下 目的是如果一个变量是已声明未赋值,就可以直接赋值;并且不能改变变量的作用域 如果未声明的话,就重新声明, 在网上搜了下,常见的方法是if(typeof(a)=='undefined'){var a='ss';}, 但是这种方法对未声明或已声明未赋值的变量都会返回true。

原文 利用try-catch判断变量是已声明未声明还是未赋值

这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下

目的是如果一个变量是已声明未赋值,就可以直接赋值;并且不能改变变量的作用域 

如果未声明的话,就重新声明, 

在网上搜了下,常见的方法是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'表示变量已声明已赋值: 

代码如下: 
       if (typeof (v) == 'undefined') {
            try {
                if (v == null)
                    alert( 'noValue');
            }
            catch (err) {
                alert(  'noDeclare');
            }
        }
        else alert('hasValue');
 
 

var a; 
console.log(f(a)); 
a=0; 
console.log(f(a)); 
console.log(f(b)); 


又错了......console.log(f(b));时会报错......

 

目录
相关文章
|
6月前
|
前端开发
11 # promise2 和 x 引用同一个变量
11 # promise2 和 x 引用同一个变量
20 0
|
1月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
29 0
|
3月前
|
Shell
变量的定义和引用
变量的定义和引用。
32 0
|
4月前
|
编译器 C++
const修饰的变量通过指针修改的问题
const修饰的变量通过指针修改的问题
55 0
|
6月前
|
SQL 分布式计算 DataWorks
使用`SET`语句来定义变量并为其赋值
使用`SET`语句来定义变量并为其赋值
144 4
|
6月前
|
SQL 分布式计算 DataWorks
可以使用SET语句来定义变量并为其赋值
可以使用SET语句来定义变量并为其赋值
40 2
|
10月前
|
人工智能 Shell
将结果分别赋值给变量
将结果分别赋值给变量
48 0
|
12月前
|
存储
静态局部变量的值(static局部变量)和自动变量(auto变量)的说明
静态局部变量的值(static局部变量): 有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次调用该函数时,该变量已有值(就是上一次函数调用结束时的值),这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明。
121 0
一个等号是赋值。两个等号是判断
一个等号是赋值。两个等号是判断
79 0
一个等号是赋值。两个等号是判断
调用windowsAPI出现 未声明的标识符 ,但是实际声明了还是报错
调用windowsAPI出现 未声明的标识符 ,但是实际声明了还是报错
调用windowsAPI出现 未声明的标识符 ,但是实际声明了还是报错