利用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 相关文章推荐
js左右弹性滚动对联广告代码分享
Feb 19 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
Mar 20 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
很棒的Bootstrap选项卡切换效果
Jul 01 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
Aug 02 Javascript
JavaScript 函数节流详解及方法总结
Feb 09 Javascript
JS验证不重复验证码
Feb 10 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
jQuery实现表格冻结顶栏效果
Aug 20 jQuery
Node.js 使用request模块下载文件的实例
Sep 05 Javascript
JS扁平化输出数组的2种方法解析
Sep 17 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
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Python collections模块使用方法详解
2019/08/28 Python
python爬虫中多线程的使用详解
2019/09/23 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
python为什么要安装到c盘
2020/07/20 Python
使用Python封装excel操作指南
2021/01/29 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
小学教师国培感言
2014/02/08 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Navicat连接MySQL错误描述分析
2021/06/02 MySQL