闭包理解
1、首先解释下闭包是什么,闭包就是指有权访问另一个函数作用域中的变量的函数。一般就是在一个函数里面创建另一个函数,比如:
function createCompareFunction(propertyName) { return function (obj1, obj2) { var value1 = obj1[propertyName]; var value2 = obj2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } } } var compareName = createCompareFunction('name') var result = compareName({name: 'xxx'}, {name: 'kkk'}) console.log(result); // 1
// 解除对匿名函数的引用,释放内存
compareName = null
通过是上面的代码我们可以看出,匿名函数可以访问createCompareFunction里的变量,那为什么呢?原因是:匿名函数作用域链里包括了createCompareFunction的活动对象
2、闭包会携带包含它函数的作用域,所以闭包会比其他函数占用更多的内存。
过度使用闭包会导致内存占有过多,除非绝对必要,否则不要轻易使用闭包。
3、闭包只能取得包含函数内任何变量的最后一个值
因为闭包保存的是整个变量对象。
4、内存泄漏
如果闭包作用域链中保存着一个HTML元素,那么意味着该元素无法被销毁
function assignHandler() { var element = document.getElementById('someElement'); element.onclick = function () { alert(element.id); } console.log(element); } var assignFunc = assignHandler();
element是assignHandler()活动对象,而闭包的作用域链则保存了它,只要匿名函数在,element的引用数就至少是1.
但是可以在assignHandler加这一句就可以解决:element = null