闭包

2018-10-10

javascript

引言

闭包的作用

  1. 获取函数的内部变量
  2. 闭包所产生的作用域包含自身活动对象, 外部函数作用域对象, 和全局变量对象
  3. 外部函数在函数返回后被销毁, 但活动对象依旧保留在内存中直到闭包被销毁(销毁方式: function = null)

    适用:
    在动态执行环境中数据会实时发生变化, 为了保持这些非持久型变量, 我们用闭包来作为载体存储

    缺点:
    外部函数调用对象不能释放
    滥用会使内存泄漏

什么是闭包

在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链中, 匿名函数从包含函数中被返回后, 它的作用域链在外部函数执行完毕后其活动对象不会被销毁, 因为匿名函数的作用域链仍在引用这个函数对象, 外部函数的作用域链在函数返回后被销毁, 但他的活动对象依然留在内存中, 直到匿名函数被销毁。function = null 解除对该函数的引用, 等于通知垃圾回收历程将其清除, 匿名函数的作用域链被销毁, 其他作用域(除了全局作用域)也都可以安全的销毁了。

1
2
3
4
5
6
7
8
9
10
11
12
13
function creatComparisonFunction(propertyName) {
return function(object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
console.log(value1, value2);
}
}
//创建函数
var compareNames = creatComparisonFunction('name');
//调用函数
compareNames({name: 'hello'}, {name:'world'});
//解除引用
compareNames = null;

上面代码在在全局作用域中的关系如下图所示

在匿名函数从createComparisonFunction()中被 返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。这样,匿名函数就可以访问在createComparisonFunction()中定义的所有变量。更为重要的是,createComparisonFunction()数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当createComparisonFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然留在内存中;直到匿名函数被销毁后,createComparisonFunction()的活动对象才会被销毁