-
当在函数内部定义了其他函数时,就创建了闭包。
-
在后台执行环境中,闭包的作用域链包含着它自己的作用域、外部函数的作用域和全局作用域。
-
通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。
-
所以,创建并立即调用一个函数,既可以执行其中的代码,又不会在内存中留下对该函数的引用。
-
但是,当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。
-
每个函数在被调用时都会自动取得两个特殊变量: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引用的对象就可以被垃圾回收了。
网友评论