利用try-catch判断变量是已声明未声明还是未赋值

 更新时间:2014年03月12日 16:49:49   作者:  
这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下
目的是如果一个变量是已声明未赋值,就可以直接赋值;并且不能改变变量的作用域

如果未声明的话,就重新声明,

在网上搜了下,常见的方法是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));时会报错......

相关文章

  • js中的闭包学习心得

    js中的闭包学习心得

    这篇文章主要介绍了js中的闭包学习心得以及重要点的代码写法,对此有兴趣的朋友跟着小编一起学习下吧。
    2018-02-02
  • JavaScript类型检测之typeof 和 instanceof 的缺陷与优化

    JavaScript类型检测之typeof 和 instanceof 的缺陷与优化

    在javascript中,typeof 和 instanceof 是用来判断数据类型比较通用的两个方法,这篇文章的目的是通过对这两个方法介绍来分析其存在的不足并提出优化方案
    2016-01-01
  • JS 中的URLSearchParams 对象操作(以对象的形式上传参数到url)

    JS 中的URLSearchParams 对象操作(以对象的形式上传参数到url)

    这篇文章主要介绍了JS中URLSearchParams的基本用法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 使用openSpeDiv方法实现Ecshop登录弹窗框效果

    使用openSpeDiv方法实现Ecshop登录弹窗框效果

    在ECSHOP的目录/JS/common.js中有一个openSpeDiv方法是实现ECSHOP的弹窗效果的。接下来通过本文给大家分享使用openSpeDiv方法实现Ecshop登录弹窗框效果,需要的朋友参考下
    2017-03-03
  • 解决小程序无法触发SESSION问题

    解决小程序无法触发SESSION问题

    这篇文章主要介绍了解决小程序无法触发SESSION问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 子窗口、父窗口和Silverlight之间的相互调用

    子窗口、父窗口和Silverlight之间的相互调用

    前两天做 silverlight 的东西,主页面打开一个子页面,然后子页面中包含一个 silverlight 应用程序那难免会涉及到他们三者相互调用的问题
    2010-08-08
  • 在iframe中使bootstrap的模态框在父页面弹出问题

    在iframe中使bootstrap的模态框在父页面弹出问题

    这篇文章主要介绍了在iframe中使bootstrap的模态框在父页面弹出问题,解决方法非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • JS实现点餐自动选择框(案例分析)

    JS实现点餐自动选择框(案例分析)

    这篇文章主要介绍了JS实现点餐自动选择框功能,点击上方全选和全不选选择框实现对应功能,本文分步骤通过实例代码讲解的非常详细,需要的朋友可以参考下
    2019-12-12
  • Three.js入门之hello world以及如何绘制线

    Three.js入门之hello world以及如何绘制线

    这篇文章主要给大家介绍了关于Three.js入门之hello world以及如何绘制线的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • JavaScript 代码分割的实现步骤

    JavaScript 代码分割的实现步骤

    JavaScript代码分割是一种优化策略,通过将代码拆分成较小的块,只在需要时加载,可以降低初始加载时间,减小页面体积,本文主要介绍了JavaScript代码分割的实现步骤,感兴趣的可以了解一下
    2024-01-01

最新评论