利用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 相关文章推荐
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
JavaScript操纵窗口的方法小结
Jun 28 Javascript
捕获和分析JavaScript Error的方法
Mar 25 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
Angular4 中常用的指令入门总结
Jun 12 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 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操作xml代码
2010/06/17 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
深入浅出php socket编程
2015/05/13 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
多广告投放代码 推荐
2006/11/13 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
Vue 过滤器filters及基本用法
2017/12/26 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
优秀党员获奖感言
2014/02/18 职场文书
珍惜水资源建议书
2014/03/12 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
redis数据结构之压缩列表
2022/03/21 Redis