Js闭包

定义:

闭包是指有权访问另一个函数作用域中的变量函数。

一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。
但是闭包函数不同。

闭包函数能访问到外部(活动对象)的属性,所以外部函数的活动对象不会执行后自动销毁。
闭包函数直行后,其活动对象自行销毁,保存全局变量对象。但是其作用链上的其他函数下的活动对象仍保存,要通过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
}