利用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 相关文章推荐
jQuery 行背景颜色的交替显示(隔行变色)实现代码
Dec 13 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
JavaScript实现获得所有兄弟节点的方法
Jul 23 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
Bootstrap基本样式学习笔记之按钮(4)
Dec 07 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
react-native动态切换tab组件的方法
Jul 07 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 Javascript
JS立即执行的匿名函数用法分析
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
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
隐性调用php程序的方法
2015/06/13 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
在textarea中显示html页面的javascript代码
2007/04/20 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
javascript json2 使用方法
2010/03/16 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
Vue header组件开发详解
2018/01/26 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
Python中的面向对象编程详解(下)
2015/04/13 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
python机器学习实现决策树
2019/11/11 Python
python文字转语音实现过程解析
2019/11/12 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Ibatis如何使用动态表名
2015/07/12 面试题
文体活动总结范文
2014/05/05 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python