JavaScript的变量作用域深入理解(转)

JavaScript的变量作用域深入理解(转)

在学习JavaScript的变量作用域之前,我们应当明确几点: 
a、JavaScript的变量作用域是基于其特有的作用域链的。 
b、JavaScript没有块级作用域。 
c、函数中声明的变量在整个函数中都有定义。 

1、JavaScript的作用域链 
首先看下下面这段代码:

 
<script type="text/javascript" language="javascript"> 
var rain = 1; 
function rainman(){ 
var man = 2; 
function inner(){ 
var innerVar = 4; 
alert(rain); 
} 
inner(); //调用inner函数 
} 
rainman(); //调用rainman函数 
</script> 

  观察alert(rain);这句代码。JavaScript首先在inner函数中查找是否定义了变量rain,如果定义了则使用inner函数中的rain变量;如果inner函数中没有定义rain变量,JavaScript则会继续在rainman函数中查找是否定义了rain变量,在这段代码中rainman函数体内没有定义rain变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了rain;在全局对象中我们定义了rain = 1,因此最终结果会弹出’1’。 
作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。 
上面的代码涉及到了三个作用域链对象,依次是:inner、rainman、window。 

2、函数体内部,局部变量的优先级比同名的全局变量高。

 
<script type="text/javascript" language="javascript"> 
var rain = 1; //定义全局变量 rain 
function check(){ 
var rain = 100; //定义局部变量rain 
alert( rain ); //这里会弹出 100 
} 
check(); 
alert( rain ); //这里会弹出1 
</script> 

3、JavaScript没有块级作用域。 
这一点也是JavaScript相比其它语言较灵活的部分。 
仔细观察下面的代码,你会发现变量i、j、k作用域是相同的,他们在整个rain函数体内都是全局的。 

 
<script type="text/javascript" language="javascript"> 
function rainman(){ 
/** 
* rainman函数体内存在三个局部变量 i j k 
*/ 
var i = 0; 
if( 1 ){ 
var j = 0; 
for( var k = 0 ; k < 3 ; k++ ){ 
alert( k ); //分别弹出 0 1 2 
} 
alert( k ); //弹出3 
} 
alert( j ); //弹出0 
} 
</script> 

  4、函数中声明的变量在整个函数中都有定义。 
首先观察这段代码。 

代码如下:

<script type="text/javascript" language="javascript"> 
function rain(){ 
var x = 1; 
function man(){ 
x = 100; 
} 
man(); //调用man 
alert( x ); //这里会弹出 100 
} 
rain(); //调用rain 
</script> 

  上面得代码说明了,变量x在整个rain函数体内都可以使用,并可以重新赋值。由于这条规则,会产生“匪夷所思”的结果,观察下面的代码。 

这是由于在函数rain内局部变量x在整个函数体内都有定义( var x= ‘rain-man’,进行了声明),所以在整个rain函数体内隐藏了同名的全局变量x。这里之所以会弹出’undefined’是因为,第一个执行alert(x)时,局部变量x仍未被初始化。 

代码如下:

<script type="text/javascript" language="javascript"> 
var x = 1; 
function rain(){ 
alert( x ); //弹出 'undefined',而不是1 
var x = 'rain-man'; 
alert( x ); //弹出 'rain-man' 
} 
rain() 
</script>

 

所以上面的rain函数等同于下面的函数。 

代码如下:
function rain(){ 
var x; 
alert( x ); 
x = 'rain-man'; 
alert( x ); 
} 

5、未使用var关键字定义的变量都是全局变量。 

代码如下:

<script type="text/javascript" language="javascript"> 
function rain(){ 
x = 100; //声明了全局变量x并进行赋值 
} 
rain(); 
alert( x ); //会弹出100 
</script> 

这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。 
6、全局变量都是window对象的属性 

代码如下:
<script type="text/javascript" language="javascript"> 
var x = 100 ; 
alert( window.x );//弹出100 
alert(x); 
</script> 

等同于下面的代码 

代码如下:
<script type="text/javascript" language="javascript"> 
window.x = 100; 
alert( window.x ); 
alert(x) 
</script> 

转载于:https://www.cnblogs.com/timerainbow/p/4446484.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109479.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android Deeplink配置

    Android Deeplink配置Deeplink启动应用配置注意事项1.Deeplink格式说明  Deeplink是目前使用广告跟踪非常热门的一种方式,Deeplink的链接类型一般是schema://host/path?params样式。2.为接收Deeplink配置intent-filter  在Android设备中,点击Deeplink后可以打开指定应用,为了能够正确定位到需要打开的应用,并正…

  • jedis 集群_iis配置api

    jedis 集群_iis配置api项目中会常用到redis,但JedisCluster的使用api还是比较多,经常可能会记不太清楚,故这里将大部分JedisCluster的api贴出来,供大家参考。一、redis在工作是一个常见的工具,这里对redis和springboot形成集群的使用。(1)引入对应redis集群所需要maven文件<dependency><groupId&g…

    2022年10月14日
  • 基于spss的聚类分析(Cluster analysis)「建议收藏」

    基于spss的聚类分析(Cluster analysis)「建议收藏」聚类分析是统计学中研究这种“物以类聚”问题的一种有效方法,它属于统计分析的范畴。聚类分析的实质是建立一种分类方法,它能够将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类。这里所说的类就是一个具有相似性的个体的集合,不同类之间具有明显的区别。定义:聚类分析是一种探索性的分析,在分类的过程中,人们不必事先给出一个分类的标准,聚类分析能够从样本数据出发,自动进行分类。聚类分析所使用方法的不同,常常会得到不同的结论。不同研究者对于同一组数据进行聚类分析,所得到的聚类数.

    2022年10月17日
  • JDBC预处理对象prepareStatement[通俗易懂]

    JDBC预处理对象prepareStatement[通俗易懂]JDBC预处理对象prepareStatement概述一、SQL注入问题SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。假设有登录案例SQL语句如下:SELECT*FROM用户表WHERENAME=用户输入的用户名ANDPASSWORD=用户输的密码;此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账…

  • SPPnet 详解[通俗易懂]

    SPPnet 详解[通俗易懂]RCNN系列:RCNN,SPPNet,FastRCNN,FasterRCNN,R-FCN。  前不久刚刚看完rcnn和fastrcnn,对目标检测的学习更进一步。sppNet简介:作者:何凯明  2016年加入成为FAIR(facebook微软研究员),2011年获得博士学位,主要兴趣和研究在计算机视觉和深度学习。获得cpvr和iccv多个奖项。 SP…

  • sql学习

    sql学习SQL学习基础SQL是什么?可以做什么?sql的全称是StructuredQueryLanguage,可以访问数据库,对数据进行增删改查,1986年成为ANSI(美国国家标准化组织)的一项标

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号