JS全局变量和局部变量_var a=‘test’ function test(){ alart(a) var a=‘run’-程序员宅基地

技术标签: js  javascript  

全局变量和局部变量

在看了一个博主写的关于js全局变量的的介绍后,自己也跟着做了一下,并且记录在这里。
原博客地址:谈谈JS的全局变量跟局部变量
博主说的比较详细,也比我的表达好。不过我的内容多了点东西,关于定义变量时不加var的影响,在文章的最后面。

先上一段代码:
<script type="text/javascript">        
        var a =1;
        function test(){
	        alert(a); 
	        a=4;
	        alert(a); 
	        var a;    
	        alert(a); 
    	}
    	test();
    	alert(a);
</script>

在网页里输出结果为:undefined > 4 > 4 > 1

原因是:
全局变量a在外部被定义,可以在全局被使用,所以最后alert(a)显示的是1。而在方法内重新var a;相当于重新定义了一个局部变量a,会在这个方法内把全局变量的作用域掩盖,而js在执行之前的扫描检测机制会使得function内部的全局变量作用能力提前失效。这段代码就相当于:

<script type="text/javascript">        
        var a =1;
        function test(){
         	var a;     //相当于声明被提前了
	        alert(a); 
	        a=4;
	        alert(a); 
	        alert(a); 
    	}
    	test();
    	alert(a);
</script>
再看:
<script type="text/javascript">        
        var a =1;
        function test(){
	        var a = 2;
	        alert(window.a);
	        alert(a);
    	}
    	test();
    	alert(a);
</script>

输出结果为:1 > 2 > 1
和java的继承有点相似,function相当于子类,会遮盖父类信息,但是如果使用super.属性依旧会看得到父类信息,这里window就像是父类。

不一样的是: java在for,if,while内定义的变量不会在他们的范围外保留,但是:

<script type="text/javascript">        
        for(var i=0;i<2;i++){
            alert(i);
        }
        alert(i)
</script>

输出结果是:0 > 1 > 2
在for循环外部,i也被保留改动了,而i是在for循环内被定义的。while和if同样如此。

还有,在定义变量时不加var

定义变量不加var,相当于在定义全局变量

<script type="text/javascript">        
        i = 2;
        function test(){
            n = 2;
            i = 3;
            alert(n);
            alert(i);
        }
        test()
        alert(n)
        alert(i)
</script>

输出结果为:2 > 3 > 2 > 3
n在function内部被定义成全局变量,所以在外部也能被访问到
但是如果在定义n时前面加上var

<script type="text/javascript">        
        i = 2;
        function test(){
            var n = 2; //加上了var
            i = 3;
            alert(n);
            alert(i);
        }
        test()
        alert(n)
        alert(i)
</script>

结果为:2 > 3
没了!最后的alert(i)被强制中断了。在控制台可以看到出现了错误:
在这里插入图片描述
说n没有被定义,因为在内部加上了var,就相当于在当前域定义变量,而当前域是function

那么你再猜一猜下面的结果是什么?:
<script type="text/javascript">        
            i = 2;
            function test(){
                alert(i);
                i = 3;
                alert(i);
            }
            test()
           	alert(i)
</script>

输出结果为:2 > 3 > 3
因为在内部并没有重新定义i,而唯一改变的i = 3;是在检测到i在外部定义后作出的改变,所以i不会被覆盖作用域,test()里第一个alert能够看到外部i的值。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45956423/article/details/111187050

智能推荐

修身齐家治国平天下 读 战国策 和 编程卓越之道 有感_修身齐家治国平天下感悟-程序员宅基地

文章浏览阅读730次。修身齐家治国平天下 读 战国策 和 编程卓越之道 有感_修身齐家治国平天下感悟

实验五 视频大文件验证_对视频做hash校验的效率怎么样-程序员宅基地

文章浏览阅读744次。一.实验内容假设某网站托管着一个任何人都可以下载的视频大文件F。下载文件的浏览器需要确保文件 是真实的,然后才能向用户显示视频内容。一种可行的方法是让网站使用抗碰撞散列函数 来散列F的内容,然后通过一些可信信道将得到的散列值h = H(F)分发给用户(稍后我们 将使用数字签名)。浏览器下载整个文件F,检查H(F)是否等于可信的哈希值h;假如相等, 浏览器便将视频显示给用户。然而,这种方法意味着只有在下载好完整的视频之后才能开始播放视频内容。我们本次实 验的目标是构建一个文件认证系统,使得浏览器在下载时可_对视频做hash校验的效率怎么样

基于在线教学平台的数据挖掘与学习行为分析_在线学习行为数据挖掘-程序员宅基地

文章浏览阅读1.3k次,点赞21次,收藏17次。近年来,随着在线教育和MOOC(Massive Open Online Courses,大规模开放式在线课程)教育的兴起,积累了海量教学行为数据与知识资源。由于教育资源的繁杂,用户难以在众多的教育资源中找到符合自己需要的学习资源,在接受信息的过程中容易形成“学习迷航”和“认知过载”。同时,教学过程发生在网络环境中,和线下课堂教学不同,教师无法全程了解和监督学生的学习情况。而对教育大数据的分析挖掘有助于破解上述难题,为智慧教育发展注入新的动力。_在线学习行为数据挖掘

Linux操作系统之c程序的编译与调试_linux编写touch.c文件编译执行-程序员宅基地

文章浏览阅读1.7k次。一、程序的编译链接过程二、编译链接在Ubntu上的具体实现三、c程序在Linux上的调试四、makefile文件:实现自动化编译五、find 命令六、grep 命令七、关机 :showdown -h now 立刻关机八、重启:showdown -r now九、文件压缩和解压_linux编写touch.c文件编译执行

springboot校园疫情防控系统-程序员宅基地

文章浏览阅读552次,点赞28次,收藏27次。2019年12月19号中国武汉发生第一例新冠病毒的到来,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇、农村,这引起我的注目,设计一套校园疫情防控系统,疫情防控需要大家共同努力、团结对学校学生进行了新型冠状病毒肺炎防控知识普及和宣传教育,通过学校广播、教室发宣传单、老师给学生谱及防疫知识,社会也可以通过微信群、短信等多种形式,从个人防护知识、居家防护知识、外出公共场所防护知识、新型冠状病毒肺炎医学知识、就医流程五个方面,有针对性地向学校学生普及了防疫知识。充分做到疫情防控人人知晓、人人参与认识病毒

CTF隐写(stegsolve)_ctf 图片隐写 stegsolve-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏7次。首先想到的得是用stegsolve分析得到flag_ctf 图片隐写 stegsolve

随便推点

解决:华为ensp软件中AR和AC,AP设备无法启动报错“40”的问题_enspap启动不了-程序员宅基地

文章浏览阅读5.1k次,点赞6次,收藏24次。AR为路由器设备,AC,AP为无线局域网设备。_enspap启动不了

php订单支付宝,PHP接入支付宝单笔订单查询接口-程序员宅基地

文章浏览阅读342次。【实例简介】PHP接入支付宝单笔订单查询接口,需要开发者签约商户功能【实例截图】【核心代码】4e705d76-2ebe-4357-8860-35ac5abd0901└── 单笔交易查询接口-single_trade_query(20161009)├── demo│ ├── single_trade_query-ASP-GBK│ │ ├── alipayapi.asp│ │ ├─..._商户查单接口

专业135总分400+西安交通大学信息与通信工程学院909/815考研经验分享_西安交大815-程序员宅基地

文章浏览阅读1.2k次。专业135总分400+西安交通大学信息与通信工程学院909/815考研经验分享_西安交大815

【C++】菱形继承及菱形虚拟继承_什么是菱形继承-程序员宅基地

文章浏览阅读242次。什么是菱形继承?首先,我们看一下单继承,以及多继承是什么?单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。虚拟继承..._什么是菱形继承

c#按键键盘事件监控上下左右和其它按键_c# 监听键盘按键-程序员宅基地

文章浏览阅读1.4k次。重写:protected override bool ProcessDialogKey(Keys keyData)就可以实现了。_c# 监听键盘按键

SQL Server 2008 定时自动备份和自动删除方法_数据库备份自动删除早期文件-程序员宅基地

文章浏览阅读1.3k次。SQL Server 2008 数据定时自动备份和自动删除方法,同一个计划兼备数据备份数数据删除的操作方法。_数据库备份自动删除早期文件

推荐文章

热门文章

相关标签