作用域

分全局作用域和局部作用域

全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用。

局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用。

   var val=1;         //全局变量,全局作用域
function func(){
var val1 = 2; //局部变量,局部作用域 }

全局变量的内存在program结束时被销毁回收。

局部变量的内存在函数调用结束时即被销毁回收。

对作用域存在的意义的总结:

1,团队开发中,运用局部作用域可以避免同名变量的竞和

2,作用域不同时,同名的变量的值和意义完全不同

3,局部变量的内存保持期间是函数的执行期间,一旦函数执行结束,内存即被释放

4,全局变量的内存保持期间是program的存续期间,program结束,内存即被释放。

5,如果把只在函数内部利用的变量,定义成全局变量,让其存在于program的整个运行期间,是一种内存浪费。

闭包

闭包的作用就是保持一个局部变量的状态,延长其生存期。

如何做到这一点呢,闭包存在的前提条件如下:

①有函数嵌套

  ②子函数用了父函数的私有变量

③该子函数处在父函数的return里边

这样的话,父函数执行完毕,销毁内存的时候,因为返回的是子函数,子函数里又有对父函数私有变量的引用,该私有变量的内存将不会被销毁,而被保留。

下面的代码就是一个闭包的例子。val原本是一个局部变量,形成闭包以后,它的值可以一直被保到module这个对象被销毁时。

    function func(){
var val=1;
return{
increment:function (){
val++;
},
show:function (){
alert(val);
}
}
}; //闭包形成
var module = func(); //val不会随着func的执行结束而销毁,可以持续到module这个对象被销毁时,延长了val变量的生存期
module.show(); //val = 1
module.increment();
module.show(); //val = 2

从上面的例子可以看出,如果不把函数设定给某个外部变量,闭包将无法形成。

函数func被赋给了module这个全局变量,那么此时module变量里究竟存了那些东西。

函数执行时,会自动生成函数对象,该对象包含内容如下,也就说这一串东西都被赋给了module这个全局变量,所以在module的存续期间,val的状态会被一直保持。

//func()执行时生成的函数对象
//{
// arguments:,
// this:,
// m:,函数的参数,如果有的话
// n:,函数的参数,如果有的话
// var:,
// increment:,
// show:,
//}

闭包可以把局部变量全局化,这算不算一种内存浪费,或者内存泄露呢?

【javascript】作用域和闭包浅析的更多相关文章

  1. javascript作用域和闭包之我见

    javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...

  2. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  3. JavaScript作用域和闭包

    在JavaScript中,作用域是执行代码的上下文.作用域有3种类型: 1.全局作用域 2.局部作用域---(又叫函数作用域) 3.eval作用域 var foo =0;//全局作用域console. ...

  4. 举例详细说明javascript作用域、闭包原理以及性能问题(转)

    转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...

  5. JavaScript 作用域和闭包

    作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...

  6. javascript作用域、闭包、对象与原型链

    原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...

  7. javascript作用域与闭包

    Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1)  全局作用域 2)  局部作用域(函数作用域) 3)  eval作用域 var foo = ...

  8. JavaScript作用域与闭包总结

    1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...

  9. javascript——作用域与闭包

    http://www.cnblogs.com/lucio-yr/p/4047972.html 一.作用域: 在函数内部:用 var 声明的表示局部变量,未用var的是全局变量. 作用域取决于变量定义时 ...

随机推荐

  1. 盒子模型(W3C盒子模型、IE盒子模型)

    盒子模型:一个物体在页面中所占据的位置 盒子模型包含以下几种元素: padding:margin:content:border 这是大家都知道的,也是书本上定义说明的,但是在ie的情况下是有点区别的; ...

  2. 浅谈Scrapy爬虫(一)

    以下谈论的 scrapy 基于 0.20.2 版本(当前最新版本是 0.22.0 ),python 2.7.6. 开发环境是windows 7 sp1.   互联网上比较有价值的参考资料 1. Scr ...

  3. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  4. CSS 样式优先级

    首先,选择器优先级顺序 优先级逐级增加的选择器列表: 通用选择器(*) 元素(类型)选择器 类选择器 属性选择器 伪类 ID 选择器 内联样式 !important 规则例外,该样式声明会覆盖CSS中 ...

  5. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  6. Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)

    Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...

  7. http协议梳理(个人学习用)

    HTTP默认的端口号为80,HTTPS的端口号为443. 在Internet中所有的传输都是通过TCP/IP进行的.HTTP协议作为TCP/IP模型中应用层的协议.HTTP协议通常承载于TCP协议之上 ...

  8. 用STM32CubeMX创建FreeRTOS项目

    1. 目标, PG13,PG14双线程双闪灯. 2. 测试平台 stm32f429i-disco keil v5.13.0.0 CubeMx 4.8.0 3. 步骤 3.1 打开cube, PG13, ...

  9. Golang 效率初(粗)测

    从接触 Golang 开始,断断续续已有差不多一年左右的时间了,都是业余自己学学看看,尚主要限于语法及语言特性,还没有用它写过实际的项目. 关于 Golang 的语法及语言特性,网上有很多资源可以学习 ...

  10. 安装软件时出现error 1337 【添加权限】

    Error 1317 An error occurred while attempting to create the directory Drive Name:\Folder Name https: ...