博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用try-catch判断变量是已声明未声明还是未赋值
阅读量:6073 次
发布时间:2019-06-20

本文共 1314 字,大约阅读时间需要 4 分钟。

原文 

这篇文章主要介绍了利用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));时会报错......

 

转载地址:http://cingx.baihongyu.com/

你可能感兴趣的文章
java transient关键字
查看>>
mvc model 传值两种方式区别
查看>>
spring
查看>>
正方教务处抓包分析
查看>>
第一次作业
查看>>
openjudge2985(数字组合)
查看>>
步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式)
查看>>
步步为营UML建模系列四、状态图(State)
查看>>
(7)javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框...
查看>>
asp.net上传图片
查看>>
如何修改EF的代码生成策略
查看>>
Yii2.0实现语言包切换功能
查看>>
寒假的Java学习笔记总结1
查看>>
C#判断操作系统的位数
查看>>
利用a标签自动解析URL
查看>>
堆,栈,字符串池,以及进程,线程浅谈内存(个人理解)
查看>>
sql语句(Mysql数据库)
查看>>
面向对象小练习
查看>>
Javaweb学习笔记——(二)——————CSS概述,进入JavaScript
查看>>
关于JDBC技术中,调用MySQL中不建议在没有服务器身份验证的情况下建立SSL连接错误解决...
查看>>