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

这篇文章主要介绍了利用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'表示变量已声明已赋值: 代码如下:
       if (typeof (v) == 'undefined') {
try {
if (v == null)
alert( 'noValue');
}
catch (err) {
alert( 'noDeclare');
}
}
else alert('hasValue');

var a; 
console.log(f(a)); 
a=0; 
console.log(f(a)); 
console.log(f(b));

又错了......console.log(f(b));时会报错......

利用try-catch判断变量是已声明未声明还是未赋值的更多相关文章

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

    目的是如果一个变量是已声明未赋值,就可以直接赋值,并且不能改变变量的作用域: 如果未声明的话,就重新声明, 在网上搜了下,常见的方法是if(typeof(a)=='undefined'){var a= ...

  2. 利用程序随机构造N个已解答的数独棋盘

    高级软件工程第二次作业:利用程序随机构造N个已解答的数独棋盘,代码如下: package SudokuGame; /** * 解决这个问题使用的是回溯+剪枝的算法 * 基本思想:不断地将每个格子可填入 ...

  3. PHP中判断变量为空的几种方法

    判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误, 所以自己整理了一下PHP中一些常用的.判断变量为空的方法. 1. isset功能:判断变量是否被初始化本函数用来测试变量是 ...

  4. [vb.net]判断窗体是否已打开

    1.使用OpenForms if my.Application.OpenForms.Item("FormName") isnot nothing then搜索 do somethi ...

  5. IE,火狐,谷歌浏览器下js判断滚动条是否已拉到页面最底部

    E/FF/Chrome下document.documentElement和document.body的 scrollHeight/scrollTop/clientHeight 以及判断滚动条是否已拉到 ...

  6. php判断变量是否存在

    isset— 检测变量是否设置, isset() 只能用于变量,因为传递任何其它参数都将造成解析错误.若想检测常量是否已设置,可使用 defined() 函数. 如果已经使用 unset() 释放了一 ...

  7. Javascript 判断变量类型的陷阱 与 正确的处理方式

    Javascript 由于各种各样的原因,在判断一个变量的数据类型方面一直存在着一些问题,其中最典型的问题恐怕就是 typeof null 会返回 object 了吧.因此在这里简单的总结一下判断数据 ...

  8. [JS]js中判断变量类型函数typeof的用法汇总[转]

    1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串.  可能的字符串有:"number"."string"."boolean&q ...

  9. Python判断列表是否已排序的各种方法及其性能分析

    目录 Python判断列表是否已排序的各种方法及其性能分析 声明 一. 问题提出 二. 代码实现 2.1 guess 2.2 sorted 2.3 for-loop 2.4 all 2.5 numpy ...

随机推荐

  1. MySQL生成-单据号不重复

    需求生成一个单据编号 单据编号结构: “单据类型” + “日期” + “流水号” 例子 : GD201605230000007 代码: DELIMITER $$ CREATE PROCEDURE `y ...

  2. Oracle Data Guard 创建物理Standby数据库

    创建物理备库 机器名                    a1                    a2                    IP:                    192 ...

  3. hdu4707 Pet

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  4. 【图论】2-sat总结

    2-sat总结 2-sat问题,一般表现的形式为.每一个点有两种方式a,b,要么选a,要么选b.而且点点之间有一些约束关系.比如:u和v至少一个选a.那么这就是一个表达式.把a当成真,b当成假,那就是 ...

  5. 腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式

    腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式 某移动公司实时 ...

  6. 菜鸟从零学编程(七)——搭建一个完整的Java开发环境

    作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...

  7. poj1066 Jugs

    poj1066 Jugs http://poj.org/problem?id=1606 解题思路:本题可以用数学方法解得,最易理解,常规的解法是搜索.直接用接近模拟的广度优先搜索即可过. 给两个容器, ...

  8. flex中在basewidget中不能使用图表组件问题

    参考 http://blog.sina.com.cn/s/blog_51e3d0e70101hljz.html

  9. Linux内核参数信息(Oracle相关)

    命令行:vim  /etc/sysctl.conf 查看如下两行的设置值,这里是: kernel.shmall = 2097152 kernel.shmmax = 4294967295 如果系统默认的 ...

  10. JS-JavaScript学习笔记(一)

    javaScript 1.文档的输出:document.write() 可输出字符,表达式,html标签.函数 2.不论什么类型和字符串相加,都会被转换成字符串类型. 比如:var i=5; var ...