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


Posted in Javascript onMarch 12, 2014

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

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

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

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 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
JavaScript Konami Code 实现代码
Jul 29 Javascript
jquery 插件开发备注
Aug 27 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
Nov 19 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
Oct 17 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
详解vue项目接入微信JSSDK的坑
Dec 14 Javascript
详解如何写出一个利于扩展的vue路由配置
May 16 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
Sep 10 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
Mar 12 #Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 #Javascript
jquery、js操作checkbox全选反选
Mar 12 #Javascript
网站繁简切换的JS遇到页面卡死的解决方法
Mar 12 #Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 #Javascript
判断一个对象是否为jquery对象的方法
Mar 12 #Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 #Javascript
You might like
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
Python处理JSON数据并生成条形图
2016/08/05 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python开发简易版在线音乐播放器
2017/03/03 Python
python读取文件名并改名字的实例
2019/01/07 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python3常见函数range()用法详解
2019/12/30 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
医学生个人求职信范文
2013/09/24 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
购房意向书
2014/04/01 职场文书
二年级小学生评语
2014/04/21 职场文书
上党课的心得体会
2014/09/02 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
抗洪救灾标语
2014/10/08 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
员工工作及收入证明
2014/10/28 职场文书
班主任经验交流材料
2014/12/16 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
2015年基层党建工作总结
2015/05/14 职场文书