利用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单向链表的具体实现实例
Jun 21 Javascript
jQuery+ajax中getJSON() 用法实例
Dec 22 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
JavaScript常用标签和方法总结
Sep 01 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
JSONP原理及简单实现
Jun 08 Javascript
IntersectionObserver API 详解篇
Dec 11 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 Javascript
vue.js watch经常失效的场景与解决方案
Jan 07 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中常用的预定义变量小结
2012/05/09 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
pycharm设置注释颜色的方法
2018/05/23 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
车辆维修工自我评价怎么写
2013/09/20 职场文书
九年级语文教学反思
2014/02/04 职场文书
消防隐患整改通知书
2015/04/22 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
美德少年主要事迹材料
2015/11/04 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
导游词之青城山景区
2019/09/27 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python