利用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 maxlength文本字数限制插件
Apr 16 Javascript
javascript椭圆旋转相册实现代码
Jan 16 Javascript
jQuery选择id属性带有点符号元素的方法
Mar 17 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
Jul 27 Javascript
js原型链与继承解析(初体验)
May 09 Javascript
JavaScript_object基础入门(必看篇)
Jun 13 Javascript
jquery  实现轮播图详解及实例代码
Oct 12 Javascript
JS实现去除数组中重复json的方法示例
Dec 21 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
WEB前端性能优化的7大手段详解
Feb 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 静态变量与自定义常量的使用方法
2010/01/26 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
python去除扩展名的实例讲解
2018/04/23 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python用for循环求和的方法总结
2019/07/08 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
写出二分查找算法的两种实现
2013/05/13 面试题
工商治理实习生的自我评价
2014/01/15 职场文书
大学总结自我鉴定
2014/01/18 职场文书
水电维修专业推荐信
2014/09/06 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
稽核岗位职责范本
2015/04/13 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书