利用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 相关文章推荐
javascript 关闭IE6、IE7
Jun 01 Javascript
Jquery 设置标题的自动翻转
Oct 03 Javascript
window.opener用法和用途实例介绍
Aug 19 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
JS简单数组排序操作示例【sort方法】
May 17 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
JavaScript 如何在浏览器中使用摄像头
Dec 02 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
Protoss兵种介绍
2020/03/14 星际争霸
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python文件写入write()的操作
2019/05/14 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
什么是makefile? 如何编写makefile?
2012/08/08 面试题
外贸实习生自荐信范文
2013/11/24 职场文书
医学生自荐信
2013/12/03 职场文书
七一党建活动方案
2014/01/28 职场文书
先进个人评语大全
2015/01/04 职场文书
自我评价优缺点范文
2015/03/11 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android