闭包问题
本质:在函数(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。