利用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 相关文章推荐
html下载本地
Jun 19 Javascript
摘自百度的图片轮换效果代码
Nov 19 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
Feb 16 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
浅析JS运动
Dec 28 Javascript
Angular 根据 service 的状态更新 directive
Apr 03 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
微信小程序简单的canvas裁剪图片功能详解
Jul 12 Javascript
微信小程序去除左上角返回键的实现方法
Mar 06 Javascript
vue监听键盘事件的相关总结
Jan 29 Vue.js
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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
javascript天然的迭代器
2010/10/29 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
Node.js文件操作详解
2014/08/16 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python清理子进程机制剖析
2017/11/23 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
关于幼儿的自我评价
2013/12/18 职场文书
标准自荐信范文
2014/01/29 职场文书
会计自荐信范文
2014/03/09 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
离职报告格式
2014/11/04 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js