利用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几个不错的函数 $$()
Oct 09 Javascript
添加JavaScript重载函数的辅助方法2
Jul 04 Javascript
jQuery UI 应用不同Theme的办法
Sep 12 Javascript
Javascript的并行运算实现代码
Nov 19 Javascript
jquery实现保存已选用户
Jul 21 Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
js 实现 list转换成tree的方法示例(数组到树)
Aug 18 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中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
Laravel find in set排序实例
2019/10/09 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
记录Django开发心得
2014/07/16 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
python绘制多个子图的实例
2019/07/07 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
小学安全工作总结2015
2015/05/18 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题