JavaScipt浅谈——全局变量和局部变量
全局变量的作用域为所属的整个程序。
全局变量的定义形式有: (1)在函数外定义
(2)在函数内定义,但不加var声明
(3)使用 window.变量名 的形式定义
(4)使用window['变量名']的形式定义
局部变量的作用域为所属的函数内部。
局部变量的定义形式有: (1)在函数内部定义的变量 (2)函数中用到的形式参数
示例:
<script>
var a=0;//全局
b=0;//全局
function c(){
var d=0;//局部
e=0;//全局
return d;
}
console.log(a);//0
console.log(b);//0
console.log(c());//0,打印的是d的值
console.log(e);//0,函数调用之后,e是有效的全局变量
console.log(d);//报错:d is not defined,函数调用后,作用域销毁,变量d变为未定义。
</script>
几种情况:函数声明提前以及全局变量和局部变量重命名的问题。
<script>
var a=0;//全局
function c(){
console.log(a);
var a=1;//局部
console.log(a);
return a;
}
console.log(a);//0
c();//undefined,1
</script>
未执行函数c的时候 console.log(a);调用的是全局变量a。
执行函数c的时候,并非是从上到下依次执行的各条语句,而是先定义变量的语句提前执行,其他语句的执行顺序不变(也就是通常所说的函数声明提前)。所以执行函数C时会先返回预定义a的值为undefined而后返回局部变量a的值为1.
相当于以下代码:
function c(){
var a;
console.log(a);
var a=1;//局部
console.log(a);
return a;
}
在函数C中定义了一个与全局变量一样的局部变量a时,函数C内部就会重新定义一个局部变量a,并将之前定义的全局变量a覆盖。不过,这个局部变量a只是在函数c中有定义,仅此而已。所以在函数C中,当第一次打印a时,实际上只定义了局部变量a,而未赋值,所以打印结果为undefined。执行第二条打印局部变量a时,已经对其进行了赋值,所以结果为1。
那么,全局变量和某个函数中的局部变量重命名,如何在该函数中获得同名全局变量的值。
<script>
var a=0;//全局
function c(){
console.log(window.a);//获得同名全局变量的值
console.log(window['a']);//获得同名全局变量的值
var a=1;//局部
console.log(a);
return a;
}
c();//0,0,1
</script>
-------------------------------------------------分割线-----------------------------------------------------
全局变量优缺点:
优点:可以减少变量的个数,减少由于实参和形参的数据传递带来的时间消耗。
缺点:(1)全局变量保存在静态存储区,程序开始运行时,为其分配内存。程序结束运行时,释放其内存,相比于局部变量的动态分配和释放内存,全局变量的生命周期长,而且当全局变量数目较多时,会占用较大的内存。
(2)使用全局变量会破坏函数的封闭性和独立性。一个函数本来是通过传参和返回值来进行输入输出的,但是用了全局变量之后,该参数就可以不仅只通过原有的参数和返回进行输入输出,这样原有的封闭性就会被破坏。这也是导致函数的可移植性降低。
(3)当一个全局变量多次被不同的语句操作,全局变量的值容易变得不清晰。这便降低了程序的可读性,不利于在编码后进行调试和查错之类的操作。
局部变量的优缺点:
优点:(1)局部变量是程序动态分配内存,所以生命周期短,不会造成长时间占用过多内存的情况。
(2)局部变量定义在函数内部,限于函数内部调用,故能很好的保持函数的封闭性。
(3)即使在多个函数内部定义了多个同名局部变量,它们之间也不会相互影响。
缺点:(1)局部变量中的数据在函数执行完后就会消失,故不利于数据的保留。
(2)局部变量的使用范围有限,仅限于所属函数的内部。
以下示例是对以上理论的综合运用:
<script>
var a=0;
function v(){
console.log('调用函数时,声明提前:'+a);
var a=1;//局部
console.log('调用函数时,未对a进行修改:'+a);
++a;
console.log('调用函数时,对a进行修改:'+a);
return a;
}
console.log('调用函数v()之前:'+a);
v();
console.log('调用函数v()之后:'+a); /** 函数运行结果依次从上到下
调用函数V()之前:0
调用函数时,声明提前:undefined
调用函数时,未对a进行修改:1
调用函数时,对a进行修改:2
调用函数V()之后:0=》调用的是全局变量a的值
***/
</script>
值得注意的是:函数调用之后,局部变量释放,即使同名于全局变量,也不会对全局变量有任何影响。
<script>
var a=0;
function v(){
console.log('调用函数时,声明提前:'+a);
a=1;//全局
console.log('调用函数时,未对a进行修改:'+a);
++a;
console.log('调用函数时,对a进行修改:'+a);
//return a;
}
console.log('调用函数v()之前:'+a);
v();
console.log('调用函数v()之后:'+a); /** 函数运行结果依次从上到下
调用函数V()之前:0
调用函数时,声明提前:0
调用函数时,未对a进行修改:1
调用函数时,对a进行修改:2
调用函数V()之后:2
***/
</script>
值得注意的是:a=1为全局变量,即使在函数中,也能找到。同时,函数也会对全局变量进行修改!
<script>
var a=0;
function v(){
console.log('调用函数时,声明提前:'+a);
a=1;//全局
b=8;
console.log('调用函数时,未对a进行修改:'+a);
++a;
console.log('调用函数时,对a进行修改:'+a);
// return a;
}
console.log('调用函数v()之前:'+a);
// console.log('调用函数v()之前b:'+b);
v();
console.log('调用函数v()之后:'+a);
console.log('调用函数v()之后b:'+b); /** 函数运行结果依次从上到下
调用函数V()之前:0
调用函数时,声明提前:0 =》调用的是全局变量a,不存在函数声明提前
调用函数时,未对a进行修改:1 =》函数中对全局变量a=0重新赋值为a=1
调用函数时,对a进行修改:2=》对全局变量进行++a操作后的值
调用函数V()之后:2 =》对全局变量进行++a操作后的值
调用函数v()之后b:8
***/
</script>
值得注意的是:语句console.log('调用函数v()之前b:'+b);执行时会报错b is not defined,而在函数调用之后b:8。
这是因为只有当函数调用之后,全局变量b才能有有效的!
JavaScipt浅谈——全局变量和局部变量的更多相关文章
- JavaScript之浅谈内存空间
JavaScript之浅谈内存空间 JavaScipt 内存自动回收机制 在JavaScript中,最独特的一个特点就是拥有自动的垃圾回收机制(周期性执行),这也就意味者,前端开发人员能够专注于业余, ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈PHP代码设计结构
浅谈PHP代码设计结构 您的评价: 还行 收藏该经验 coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露. 如何看 ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- 关于AngularJS学习整理---浅谈$scope(作用域) 新手必备!
作为初次接触 AngularJS的新手,想要深层理解里面的内容短时间还是不可能的,所以标题写了浅谈字样,以下内容是参考各位大神以及相关书籍整理加个人理解,出现错误的地方请大家指正. $scope(作用 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 浅谈Windows API编程
WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...
随机推荐
- Cocos2D:塔防游戏制作之旅(九)
炮塔哲学:敌人,攻击波和路径点 在创建敌人之前,让我们先为它们"铺路".敌人将沿着一系列的路径点前进,这些路径点互相连接,它们被定义为敌人在你创建的世界中移动的路径. 敌人将在第一 ...
- MongoDB分组
MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...
- 谈谈Ext JS的组件——布局的使用方法续一
盒子布局 盒子布局主要作用是以水平(Ext.layout.container.HBox)或垂直方式(Ext.layout.container.VBox)来划分容器区域.这也是比较常有的布局方式. 使用 ...
- React Native之样式
样式 React Native 不实现 CSS,而是依赖于 JavaScript 来为你的应用程序设置样式.这是一个有争议的决定,你可以阅读那些幻灯片,了解背后的基本原理. 声明样式 在 React ...
- Python2.x的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
刚遇到这个问题的时候,在网上找了 半天,发现都是说 添加如下三行代码即可解决问题, [python] import sys reload(sys) sys.setdefaultencoding('ut ...
- windows与linux下的\r\n
\n 为ASCII的0x0a 换行 \r 为ASCII的0x0d 回车 在windows 系统中,当你输入回车时会自动变成\r\n 在l ...
- H5 学习之旅-H5表格(7)
表格语法 table:简历表格 captian:表格标题 th:表格行表头 tr:表格行 td:单元格 thead:表格页眉 tfoot:表格页脚 tbody:表格主体 col:列属性 !!!代码实例 ...
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
- iOS雷达图 iOS RadarChart实现
实现效果 刚拿到设计稿的时候大概看了一眼,当时心里想着放张背景图,然后计算下相应点的坐标,在最上面画一层就OK了,其实一开始实现的时候也确实是这么做的,然后我就日了狗了,发现设计稿上多层五边形的间隔不 ...
- S3c2440A WINCE平台HIVE注册表+binfs的实现
今天最大的收获莫过于把binfs和hive注册表同时在三星的平台上实现了,这可是前无古人啊(只是看到好多哥们说找不到三星的HIVE资料),哈哈哈.怕今天的成果日后成炮灰,还是写下来比较好,要养成这样的 ...