利用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加解密功能页面
Dec 12 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
基于javascript实现简单的抽奖系统
Apr 15 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
Web安全测试之XSS实例讲解
Aug 15 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
javascript学习之json入门
Dec 22 Javascript
关于vue.js v-bind 的一些理解和思考
Jun 06 Javascript
Vue实现Layui的集成方法步骤
Apr 10 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
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 源代码压缩小工具
2009/12/22 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
PHP中Array相关函数简介
2016/07/03 PHP
PDO::inTransaction讲解
2019/01/28 PHP
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
英国办公用品商店:Office Outlet
2018/04/04 全球购物
学院书画协会部门职责
2013/11/28 职场文书
集体备课反思
2014/02/12 职场文书
战略合作协议书范本
2014/04/18 职场文书
跳蚤市场口号
2014/06/13 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server