闭包到底是什么???

来源:互联网 发布:zepto.js 左右滑动 编辑:程序博客网 时间:2024/04/29 17:28

从学js以来,闭包就一直困扰着我,今天总算是搞懂了,写篇博客记录一下。

闭包的定义是:闭包是指有权访问另一个函数作用域中的变量的函数。

简单来说,就是一个函数,它可以访问它的包含函数的变量。

作用域链与闭包息息相关。为什么这么说呢,因为闭包的标识符解析是要沿着作用域链找上去的。

创建闭包的常见方式就是在一个函数中创建另一个函数,里面新创建的这个函数就是一个闭包。举个栗子:

function f() {    var fff = "fff";    return function(){        alert(fff);    }}
var x = f();f = null;x();    //"fff"

根据闭包的定义来讲,内部匿名函数可以访问包含函数内的所有变量,这是没问题的。容易让人产生疑问的是:明明在调用x函数之前我已经又将f函数设置为null了,为什么x函数还可以访问到原f内的fff变量呢?

这是因为:f函数返回后,f的作用域链确实会被销毁,但它的活动对象仍会留在内存中,不会被销毁,因为匿名函数的作用域链仍然在引用这个函数。直到匿名函数被销毁后,f的活动对象才会被销毁。这才导致了x函数仍可引用f函数内的变量。

最后总结一下闭包:通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

0 0
原创粉丝点击