当在函数内部定义了其他函数时,就创建了闭包。
在后台执行环境中,闭包的作用域链包含着它自己的作用域、外部函数的作用域和全局作用域。
通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。
所以,创建并立即调用一个函数,既可以执行其中的代码,又不会在内存中留下对该函数的引用。
但是,当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。
每个函数在被调用时都会自动取得两个特殊变量:this和arguments,内部函数在搜索这两个变量时,只会搜索到自己的活动对象为止,因此永远不可能直接访问外部函数的这两个变量,所以在闭包函数里的this,指向的是window对象。
-
例如:
var name = "The Window";var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); //"The Window"
清理内存:
function assign(){ var element = document.getElementById("xxx"); var id = element.id; element.onclick = function(){ alert(id); // alert(element.id); } element = null; }
解析:DOM对象往往占据较大的内存,当在闭包函数内直接访问element.id时,element具有两个引用数,引用数大于0就无法被垃圾回收。
改进:用id = element.id来取得需要的值,而避免在闭包内对element的整个引用,但此时element依然在外部函数的作用域中被引用,引用数为1依旧大于0,所以为了使element所指对象的引用数0,在使用完后要将element的引用指向null,这样之前被element引用的对象就可以被垃圾回收了。
js--闭包
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...