js闭包

来源:互联网 发布:傻瓜进销存软件农贸 编辑:程序博客网 时间:2024/05/28 16:26

1. 什么是闭包
闭包(closure)官方定义:闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量
在js中,由于函数作用域的限制,外部的函数无法读取内部的局部变量,当我们要取这个局部变量的时候可以通过在局部变量所定义函数内部再定义一个函数,新定义的这个函数就是闭包。
2.闭包的特点:
a.可以读取函数内部的变量;
b.闭包使局部变量始终保存在内存中,不被垃圾回收;
c.闭包会把函数的变量都保存在内存中,内存消耗大,解决的办法是在函数推出之前把不使用的局部变量全部删除。(?=null;)
d.闭包会在父函数外部改变父函数内部变量的值。当把父函数当做对象使用,把闭包当做公用方法,把内部变量当做私有属性,不能随意改变父函数内部变量的值。
3.闭包的demo
一个简单的闭包的例子:函数f2就是一个闭包:
这里写图片描述
可以一直保存变量不被垃圾回收的例子:
这里写图片描述
闭包在for循环里的应用:
这里写图片描述
4.闭包为什么能保证变量不会被垃圾回收?
function f1(){
var a=1;
function f2(){
alert(a);
}
return f2;
}
var result=f1();
result();
拿这个例子来说,f2函数是闭包;f1函数赋给了一个全局变量result,因为result始终在内存中所以f1()始终在内存中,f1是f2的父函数,所以f2始终在内存中不会被垃圾回收。
5.内存泄漏
这里写图片描述
参考:https://segmentfault.com/a/1190000000652891
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://stackoverflow.com/questions/111102/how-do-javascript-closures-work

0 0
原创粉丝点击