定义:
闭包是指有权访问另一个函数作用域中的变量函数。
一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。
但是闭包函数不同。
闭包函数能访问到外部(活动对象)的属性,所以外部函数的活动对象不会执行后自动销毁。
闭包函数直行后,其活动对象自行销毁,保存全局变量对象。但是其作用链上的其他函数下的活动对象仍保存,要通过null将其解除该函数的引用,通知垃圾回收例程将其清除。(防止内存泄漏)
闭包与变量
闭包只能取得包含函数中任何变量的最后一个值(闭包保存的是整个变量对象,而不是某个特殊变量)
var result = [];
for(var i = 0; i<10; i++) {
result[i] = function( {
return i
}
}
PS: result结果是一个函数数组,每个函数都返回10。因为每个函数的作用域链中都保存着createFunctions()函数的活动对象,所以它们引用都是同一个变量i(10)。
var result = [];
for(var i = 0; i<10; i++) {
result[i] = function(num) {
return function() {
return num;
}
}(i)
}
PS:由于函数参数是按值传递的,所以就会将变量i的当前值复制给参数num。result数组中的每个函数都有自己num变量的一个副本,因此返回各自不同的数值。
关于this对象:
var name = "the window";
var object = {
name: "my Object",
getNameFunc: function() {
return function() {
return this.name; // the window
}
}
}
每个函数在被调用时都会自动获取两个特殊变量,this和arguments。
内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。不过,把外部作用域的this对象保存在一个闭包能够访问的变量里,就可以让闭包访问该对象了。
var that = this;
return function() {
return that.name
}
