利用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 相关文章推荐
IE FF OPERA都可用的弹出层实现代码
Sep 29 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
Dec 18 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
JavaScript插件Tab选项卡效果
Nov 14 Javascript
js实现延迟加载的几种方法详解
Jan 19 Javascript
小程序最新获取用户昵称和头像的方法总结
Sep 23 Javascript
vue3.0 数字翻牌组件的使用方法详解
Apr 20 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
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
node.js的事件机制
2017/02/08 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
医药工作岗位求职信分享
2013/12/31 职场文书
党员违纪检讨书
2014/02/18 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
武夷山导游词
2015/02/03 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
投诉书范文
2015/07/02 职场文书