利用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 相关文章推荐
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
基于JQuery制作可编辑的表格特效
Dec 23 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
May 10 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
Jun 24 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
基于JavaScript实现带缩略图的轮播效果
Jan 12 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
electron踩坑之remote of undefined的解决
Oct 06 Javascript
通过实例解析js可枚举属性与不可枚举属性
Dec 02 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
在IIS上安装PHP4.0正式版
2006/10/09 PHP
第一节--面向对象编程
2006/11/16 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
微信小程序入门教程
2016/11/18 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
js date 格式化
2017/02/15 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python numpy 按行归一化的实例
2019/01/21 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python多进程并行代码实例
2019/09/30 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
python字符串的index和find的区别详解
2020/06/20 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
JDK安装目录下有哪些内容
2014/08/25 面试题
应届生求职信写作技巧
2013/10/24 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书