利用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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
AngularJS+Node.js实现在线聊天室
Aug 28 Javascript
用jquery的attr方法实现图片切换效果
Feb 05 Javascript
BootStrap入门学习第一篇
Aug 28 Javascript
javascript 作用于作用域链的详解
Sep 27 Javascript
Node.js爬取豆瓣数据实例分析
Mar 05 Javascript
vue中的计算属性实例详解
Sep 19 Javascript
如何制作一个Node命令行图像识别工具
Dec 12 Javascript
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 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将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
围观tangram js库
2010/12/28 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
大二自我鉴定范文
2013/10/05 职场文书
商场中秋节活动方案
2014/02/07 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS