利用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 命名空间以提高代码重用性
Nov 13 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
Apr 16 Javascript
获取3个数组不重复的值的具体实现
Dec 30 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
Oct 19 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
Vue.js手风琴菜单组件开发实例
May 16 Javascript
HTML5开发Kinect体感游戏的实例应用
Sep 18 Javascript
详解Vue中watch的高级用法
May 02 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
May 24 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 和 MySQL 基础教程(四)
2006/10/09 PHP
PHP中cookies使用指南
2007/03/16 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Selenium定位元素操作示例
2018/08/10 Python
Python递归函数实例讲解
2019/02/27 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Python模块 _winreg操作注册表
2020/02/05 Python
python文件和文件夹复制函数
2020/02/07 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
蔻驰法国官网:COACH法国
2018/11/14 全球购物
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
房屋委托书范本
2014/04/04 职场文书
大学生村官考核材料
2014/05/23 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android