JavaScript 闭包
来源:互联网 发布:主力如何拉升股价 知乎 编辑:程序博客网 时间:2024/06/08 00:29
前言:
如何从外部读取局部变量?
这就引入了闭包的概念
想要理解闭包,需要提前理解连个概念垃圾回收和作用域。
1.垃圾回收机制:
- 在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。
- 如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
- 如果这两个对象相互引用,并且其中一个对象被其他对象引用,那么GC不会回收这些变量。
2.作用域
JavaScript闭包例子
function outerFun() { var a=0; function innerFun() { a++; alert(a); } }innerFun()
上面的代码是错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.
改成如下,也就是闭包:
Js代码
function outerFun(){ var a=0; function innerFun() { a++; alert(a); } return innerFun; //注意这里}var obj=outerFun();obj(); //结果为1obj(); //结果为2var obj2=outerFun();obj2(); //结果为1obj2(); //结果为2
解析
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。看下面这段代码:
这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。
这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
- 简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
- 当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
- 那么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。
使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便
改变父函数内部变量的值。
摘取自:http://www.jb51.net/article/24101.htm
- 【JavaScript】Javascript闭包
- javascript的闭包javascript
- Javascript闭包演示javascript
- [ javascript ] javascript闭包测试!
- 【javascript】javascript中的闭包
- 【javascript】学习Javascript闭包
- 理解 JavaScript 闭包
- javascript 闭包
- javascript闭包
- Javascript闭包
- JavaScript中的"闭包"
- JavaScript 闭包
- javascript中的闭包
- 理解 JavaScript 闭包
- Javascript Closures[闭包]
- javascript闭包
- Javascript 闭包详解
- Javascript闭包技术
- ListView嵌套卡顿问题分析及解决
- C++Primer第五版中的c++11特性归纳(二)
- 动态规划
- ES6 你可能不知道的事
- framework7+arcgis js api开发问题
- JavaScript 闭包
- css元素hover時控制另一个元素的显示隐藏
- scrapy中文存储
- 别怕丨苹果MacOS被爆系统漏洞 教你如何避免
- 听见丨特斯拉Semi电动卡车销量不错 主打轻量级AI解决方案,禾思科技获1000万元天使轮融资
- 通过存储技术建立数据中心存储层
- ARM 使用调试接口输出打印信息
- mybatis+mysql查询类别下的所有子类别(递归)
- Linux中的文件特殊权限