利用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直接编辑当前cookie的脚本
Sep 14 Javascript
基于jquery的无缝循环新闻列表插件
Mar 07 Javascript
用js的for循环获取radio选中的值
Oct 21 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 Javascript
javascript中的this作用域详解
Jul 15 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
Feb 03 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 的几个配置文件函数
2006/12/21 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
Python 基础之字符串string详解及实例
2017/04/01 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
匡威德国官网:Converse德国
2019/01/26 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
公司担保书范文
2014/05/21 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
个人求职意向书
2015/05/11 职场文书
家庭贫困证明
2015/06/16 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
vscode中使用npm安装babel的方法
2021/08/02 Javascript