利用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 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
Javascript学习笔记2 函数
Jan 11 Javascript
jquery实现非叠加式的搜索框提示效果
Jan 07 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
Feb 13 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
浅析AngularJS中的生命周期和延迟处理
Jun 18 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
jQuery实现给input绑定回车事件的方法
Feb 09 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 Javascript
node.js使用express框架进行文件上传详解
Mar 03 Javascript
Vue获取微博授权URL代码实例
Nov 04 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查询mssql出现乱码的解决方法
2014/12/29 PHP
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
js实现select二级联动下拉菜单
2020/04/17 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
Python如何实现单例模式
2016/06/03 面试题
女大学生毕业找工作的自我评价
2013/10/03 职场文书
人事专员岗位说明书
2014/07/29 职场文书
公证委托书标准格式
2014/09/11 职场文书
护士实习自荐信
2015/03/06 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android