js和html全局变量,JavaScript全局变量与局部变量

js和html全局变量,JavaScript全局变量与局部变量原文:深入理解JavaScript的变量作用域在学习JavaScript的变量作用域之前,我们应当明确几点:JavaScript的变量作用域是基于其特有的作用域链的。JavaScript没有块级作用域。函数中声明的变量在整个函数中都有定义。1、JavaScript的作用域链首先看下下面这段代码:varrain=1;functionrainman(){varman=2;function…

大家好,又见面了,我是你们的朋友全栈君。

原文:深入理解JavaScript的变量作用域

在学习JavaScript的变量作用域之前,我们应当明确几点:JavaScript的变量作用域是基于其特有的作用域链的。

JavaScript没有块级作用域。

函数中声明的变量在整个函数中都有定义。

1、JavaScript的作用域链

首先看下下面这段代码:

var rain = 1;

function rainman(){

var man = 2;

function inner(){

var innerVar = 4;

alert(rain);

}

inner(); //调用inner函数

}

rainman(); //调用rainman函数

观察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、函数体内部,局部变量的优先级比同名的全局变量高。

var rain = 1; //定义全局变量 rain

function check(){

var rain = 100; //定义局部变量rain

alert( rain ); //这里会弹出 100

}

check();

alert( rain ); //这里会弹出1

3、JavaScript没有块级作用域。

这一点也是JavaScript相比其它语言较灵活的部分。

仔细观察下面的代码,你会发现变量i、j、k作用域是相同的,他们在整个rain函数体内都是全局的。

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

}

4、函数中声明的变量在整个函数中都有定义。

首先观察这段代码:

function rain(){

var x = 1;

function man(){

x = 100;

}

man(); //调用man

alert( x ); //这里会弹出 100

}

rain(); //调用rain

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

var x = 1;

function rain(){

alert( x ); //弹出 ‘undefined’,而不是1

var x = ‘rain-man’;

alert( x ); //弹出 ‘rain-man’

}

rain();

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

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

function rain(){

var x;

alert( x );

x = ‘rain-man’;

alert( x );

}

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

function rain(){

x = 100; //声明了全局变量x并进行赋值

}

rain();

alert( x ); //会弹出100

这也是JavaScript新手常见的错误,无意之中留下的许多全局变量。

6、全局变量都是window对象的属性

var x = 100 ;

alert( window.x );//弹出100

alert(x);

等同于下面的代码

window.x = 100;

alert( window.x );

alert(x)

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131252.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#利用微软企业库Enterprise Library操作mysql数据库

    C#利用微软企业库Enterprise Library操作mysql数据库在C#项目中,很多时候到要用到EnterpriseLibrary。这里只是用一个很简单的小例子来演示一下EnterpriseLibrary在VS2010中操作mysql数据库的流程。1,利用EnterpriseLibrary操作mysql数据库。首先要具备一下天剑     (1)项目中要引用MySql.Data和MysroSoft.Practices.EnterpriseLibra

    2022年10月20日
    0
  • ArcGIS二次开发基础教程:开发环境配置教程(ArcEngine10.4+VS2019)[通俗易懂]

    ArcGIS二次开发基础教程:开发环境配置教程(ArcEngine10.4+VS2019)[通俗易懂]ArcEngine10.4+VS2019(其他版本类似)开发环境配置教程由于ArcGIS、ArcEngine以及承载开发环境的VisualStudio的版本众多,其开发环境的配置也有不小的难度,故写此文章写给新入门ArcGIS二次开发的同学,帮助他们摆平入门的第一道坎。(当然不是,主要是写给我自己以后看的,省得我又要到处找教程)进行ArcGIS二次开发有很多种方式,比如现在主流的Python、AE+C#等。如题,这里说的是AE+C#开发的第一步,开发环境的配置。对进一步开发有兴趣的朋友可以去看我的CS

    2022年7月23日
    5
  • CSS控制文本超出指定宽度显示省略号和文本不换行

    一般的文字截断(适用于内联与块):.text-overflow{display:block;/*内联对象需加*/width:31em;/*何问起hovertree.com*/word

    2021年12月23日
    43
  • fec什么意思_QQ浏览器怎么使用WebRTC

    fec什么意思_QQ浏览器怎么使用WebRTCWebRTC::FEC目录WebRTC::FEC ULPFEC FLEXFEC Encodeulpfec Decodeulpfec 动态FEC冗余度 FlexFECinWebRTC WebRTC::FECTags:WebRTCFECWebRTC中的FEC实现分为UlpFEC和FlexFEC ulpfec:rfc5109 …

    2022年8月11日
    4
  • OpenProcessToken

    OpenProcessTokenOpenProcessToken  要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCES

    2022年6月25日
    20
  • Ansys 圣维南原理「建议收藏」

    Ansys 圣维南原理「建议收藏」简介圣维南原理分布于弹性体上一小块面积(或体积)内的荷载所引起的物体中的应力,在离荷载作用区稍远的地方,基本上只同荷载的合力和合力矩有关;荷载的具体分布只影响荷载作用区附近的应力分布。还有一种

    2022年8月4日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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