利用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 22 Javascript
javascript 动态生成私有变量访问器
Dec 06 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
Mar 13 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
webpack踩坑之路图片的路径与打包
Sep 05 Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 Javascript
vue-cli3 DllPlugin 提取公用库的方法
Apr 24 Javascript
Vue实现背景更换颜色操作
Jul 17 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
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php实现paypal 授权登录
2015/05/28 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
使用PHP开发留言板功能
2019/11/19 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python opencv实现简易画图板
2020/08/27 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
网络方面基础面试题
2012/11/16 面试题
工地门卫岗位职责
2013/12/30 职场文书
经典团队口号大全
2014/06/21 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
2015年计划生育责任书
2015/05/08 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
mysql主从复制的实现步骤
2021/10/24 MySQL
详解Vue3使用axios的配置教程
2022/04/29 Vue.js