JavaScript的闭包

46 阅读1分钟

闭包问题

本质:在函数(A)的内部创建另一个函数(B),由于作用域链的关系,内部函数可以访问外部函数的变量,当调用内部函数(B)时,B会访问A内部的变量,导致A在执行完毕之后A的活动对象也不会被销毁,因为B函数的作用域链中在引用这个活动对象。A执行完毕之后A本身的作用域链会被销毁,但是它的活动对象依然会保留在内存中,直到引用该活动对象的B函数销毁后,A的活动对象才会销毁。

缺点:闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。

闭包只能取得包含函数中任何变量的最后一个值,因为闭包保存的是整个变量对象,而不是某个特殊的值

function createFunctions() {
    var result = new Array();
    for (var i = 0; i < 10; i++) {
        result[i] = function () {
            return i;
        }
    }
    return result;
}

该函数会返回一个函数数组,每个函数返回i的值,因为每个函数的作用域链中都保存着createFunctions()的活动对象,所以他们引用的都是同一个变量i,当函数返回后,i的值是10,此时每个函数都引用着保存变量i的变量对象,所以每个函数内部的i都是10。