当前位置: 首页 > news >正文

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

原文 利用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));时会报错......

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NIST发布云计算参考体系结构
  • Winform基础
  • 《Visual C++ 2008入门经典》学习笔记(1)——数据类型
  • MySQL索引的三星评估(three-star system)
  • 配置 RAC 负载均衡与故障转移
  • 新界面新功能Firefox 4.0 RC重磅登场
  • java.util.concurrent-------TimeUnit
  • Play Framework 1.2正式版发布
  • RS特殊报表样式需求处理
  • Opera将尽快发布补丁修复桌面浏览器漏洞
  • 关于NetScaler与后台XD环境之前需要开放的防火墙端口
  • Ubuntu下配置Nginx HTTPS
  • libsvn_subr-1.so.0: undefined symbol: apr_atomic_xchgptr 故障解决
  • 轻博客是款好产品
  • MVC下的客户端模板技术
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译]前端离线指南(上)
  • 【css3】浏览器内核及其兼容性
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CentOS7 安装JDK
  • const let
  • java8 Stream Pipelines 浅析
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • nodejs调试方法
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 初识 webpack
  • 树莓派 - 使用须知
  • 微服务入门【系列视频课程】
  • 微信开放平台全网发布【失败】的几点排查方法
  • 详解移动APP与web APP的区别
  • 正则与JS中的正则
  • 阿里云API、SDK和CLI应用实践方案
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​插件化DPI在商用WIFI中的价值
  • ![CDATA[ ]] 是什么东东
  • # include “ “ 和 # include < >两者的区别
  • #nginx配置案例
  • #php的pecl工具#
  • (¥1011)-(一千零一拾一元整)输出
  • (Java入门)学生管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)c52学习之旅-流水LED灯
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .NET 8.0 发布到 IIS
  • .net core 6 集成和使用 mongodb
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net Core中Quartz的使用方法
  • .Net MVC + EF搭建学生管理系统
  • .net 提取注释生成API文档 帮助文档
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET值类型变量“活”在哪?
  • .py文件应该怎样打开?