深入理解Javascript闭包.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:2 大小:16KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

深入理解Javascript闭包.doc

深入理解Javascript闭包.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://blog.csdn.net/hitman9099/article/details/3854171"理解Javascript闭包什么是闭包?闭包的‘官方’解释,闭包是指可以调用一个函数局部变量的函数。相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。如下代码:functionoperation(i){functionadd(j){alert(j+i);}returnadd;//返回add的一个引用}varresulted=operation(10);resulted(10);//ouput20两大特点:函数operation中嵌套了一个add函数;Operation中返回了add函数的引用;这样在声名了resulted后将operation(10)赋值给resulted,实际上是将resulted指向了add函数。再执行resulted时产出20;综上所述:当函数A的内部函数B,被函数A之外一个变量引用的时候,就创建了一个闭包为什么要使用闭包?简而言之,闭包的作用就是在A执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回A所占用的资源,因为A的内部函数B的执行需要依赖A中的变量。这是对闭包作用的非常直白的描述;修改之前的函数functionoperation(arg){vari=arg;functionadd(j){i=j+i;alert(i);}returnadd;//返回add的一个引用}varresulted=operation(10);resulted(10);//ouput20resulted(10);//ouput30resulted(10);//ouput40在operation中声名了一个变量I;变量I在Add函数中被调用。并i=j+I;弹出变量i并将add返回。并且还可以看出,变量I是保存在operation的作用域之内。使得变量I被不受外界干扰。且只有在调用add函数的引用时i才会发生变化。闭包的作用就是将函数的局部变量保存下来。闭包的利弊名词解释:内存泄漏是指内存不停的被占用却得不释放的一个过程。闭包的弊端会引致内存泄漏。为什么会导致内存泄漏?一般函数在执行完之后就会被GC(GarbageCollection垃圾收集器)给回收了,然而闭包却不是。如上例。当operation(10)赋值给resulted的后。//一般函数都会被GC回收了。然而在回收operation时发现其内部add仍然在被引用,operation被出。没有回收成功//GC回收机制不是这样的,但这样理解可以更好的了解闭包为什么会导致内存泄漏Operation没有被回收,所以其内部的作用域被保留下来了。这样变量i和函数add得以保留。从函数的作用域的角度来解释闭包,当函数operation执行变之后,此时operation返回add引用给resulted.函数Add的作用域链包含了operation的活动对象i的引用。也就是add可以访问到operation中的变量和函数,函数add被resulted引用,add又依赖与operation函数,因些operation是不会GC回收的。避免内存泄漏。当闭包被引用完之后将其设置为null以等待GC回收。如下在引用完之后将其销毁varresulted=operation(10);resulted=null;//此时对函数add的引用被撤销。GC轮询到add的被撤销后会将operation回收