利用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 相关文章推荐
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
初识javascript 文档碎片
Jul 13 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
Jun 08 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
Apr 29 Javascript
JavaScript中用let语句声明作用域的用法讲解
May 20 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
Sep 19 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
Sep 26 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 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
第四节--构造函数和析构函数
2006/11/16 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP实现的自定义数组排序函数与排序类示例
2016/11/18 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
js 函数调用模式小结
2011/12/26 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
华为c/c++笔试题
2016/01/25 面试题
局域网定义和特性
2016/01/23 面试题
期末自我鉴定
2014/01/23 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python