javascript闭包的理解_第1页
javascript闭包的理解_第2页
javascript闭包的理解_第3页
javascript闭包的理解_第4页
javascript闭包的理解_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JavaScript 闭包一、变量的作用域:要理解闭包,首先必须理解Javascript特殊的变量作用域。变量作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。var n=999;fun ctio n f1()alert( n);f1(); / 999另一方面,在函数外部自然无法读取函数内的局部变量。fun ctio n f1()var n=999;alert (n); / error这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!fun ctio n f1()n=99

2、9;f1();alert( n); / 999二、如何从外部读取局部变量?有时候需要得到函数内的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数:fun ctio n f1()var n=999;fun ctio n f2()alert( n); / 999在上面的代码中,函数f2就被包括在函数fl内部,这时fl内部的所有局部变 量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对fl就是不可见的。这就是Javascript 语言特有的“链式作用域”结构既然f2可以读取fl中的局部变量,那么只要把f2作为返回值,我们不就可以 在fl外部

3、读取它的内部变量了吗!fun ctio n f1()var n=999;fun ctio n f2()alert( n);return f2;var result=f1();result(); / 999三、闭包的概念上一节代码中的f2函数,就是闭包。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可 以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包的两个特点:1、作为一个函数变量的一个引用当函数返回时,其处于激活状态2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。其实上面两点可以合成一点

4、,就是闭包函数返回时,该函数内部变量处于激活状 态,函数所在栈区依然保留我们所熟知的主流语言,像Cjava 等,在函数内部只要执行了 return, 函数就 会返回结果,然后内存中删除该函数所在的区域生命周期也就停止了 一般的 js函数也是这样.但是有闭包特性的js函数有点特殊就例子来说:fun cti on a()var i=0;fun ctio n b()alert(+i);return b;var c = a();c();在函数a中定义了函数b,a又return 了 b的值.functionvar 1=0;4 function b()alert(+i):is日 turn b;var c

5、= a 0;c ();这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出 一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数 a外的变量c引用了函数a 内的函数b,就是说:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个 闭包。可是,如果我们再多执行一行.var c = a();c();c();第一次弹出1,第二次执行却弹出了 2.也就是说,第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留.a是return过了,但是,a及内部值却依然存在,这就是闭包.好了,总结下:1, 闭包外层是个函数.2, 闭包内部

6、都有函数.3,闭包会return内部函数.4,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在四、闭包的用途:1、 可以读取函数内部的变量,保护函数内的变量安全。 以最开始的例子为例, 函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了 i 的安全性。2、 让这些变量的值始终保持在内存中。依然如前例,由于闭包,函数a中i的 一直存在于内存中,因此每次执行 c(),都会给i自加1。为什么会这样呢?原因就在于 a()是b()的父函数,而b()被赋给了一个全局变 量,这导致b()始终在内存中,而b()的存在依赖于a(),因此a()也始终在内存 中,不会在调用结束后,被垃圾回收机制(garbage collection )回收。五、使用闭包要注意:1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能 滥用闭包,否则会造成网页的性能问题,在 IE中可能导致内存泄露。解决方法 是,在退出函数之前,将不使用的局部变量全部删除。2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论