利用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 asp.net 用json格式返回自定义对象
Apr 07 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
JavaScript仿微博输入框效果(案例分析)
Dec 06 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 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
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
经验几则 推荐
2006/09/05 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
微信小程序实现星级评分和展示
2018/07/05 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
浅谈Python数据类型之间的转换
2016/06/08 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
Django开发的简易留言板案例详解
2018/12/04 Python
Django 多环境配置详解
2019/05/14 Python
Python实现最大子序和的方法示例
2019/07/05 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
挑战杯创业计划书的写作指南
2014/01/07 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python