利用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 相关文章推荐
Jquery实现简单的动画效果代码
Mar 18 Javascript
js 为label标签和div标签赋值的方法
Aug 08 Javascript
jQuery实现带滑动条的菜单效果代码
Aug 26 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
深入理解angularjs过滤器
May 25 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
Jun 27 Javascript
解决vue v-for 遍历循环时key值报错的问题
Sep 06 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
微信小程序scroll-view点击项自动居中效果的实现
Mar 25 Javascript
解决Nuxt使用axios跨域问题
Jul 06 Javascript
详解Vue中的MVVM原理和实现方法
Jul 15 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
php设计模式 Facade(外观模式)
2011/06/26 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
webpack 代码分离优化快速指北
2019/05/18 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
速记Python布尔值
2017/11/09 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
高校教师岗位职责
2014/03/18 职场文书
太行山上观后感
2015/06/05 职场文书
秋收起义观后感
2015/06/11 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
Java数组详细介绍及相关工具类
2022/04/14 Java/Android