利用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 关键字屏蔽实现函数
Aug 02 Javascript
jQuery代码优化之基本事件
Nov 01 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
Jun 04 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
JS集成fckeditor及判断内容是否为空的方法
May 27 Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 Javascript
vue 组件 全局注册和局部注册的实现
Feb 28 Javascript
微信小程序实现留言功能
Oct 31 Javascript
React如何实现浏览器打印部分内容详析
May 19 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 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
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
编辑找工作求职信范文
2013/12/16 职场文书
制作部班长职位说明书
2014/02/26 职场文书
关于安全的广播稿
2014/10/23 职场文书
五四青年节活动总结
2015/02/10 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
python编写函数注意事项总结
2021/03/29 Python