闭包:当内部函数被返回到外部时,会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(其实就是占内存)
函数定义时,可以不看里面写了什么,只有在执行时才看里面的代码
当a执行时,定义b,并把b的引用返回出去。此时,a执行完,它自己的AO销毁,按理来说b也就没有了,但是b被返回出去了,它的作用域链没有断,仍然指向a的AO和GO(这里b没有执行,所以没有生成它自己的AO,第0位仍然是a的AO)
之前对这个函数不理解,明白了作用域就很清楚了
function a(){
var arr = [];
for(var i = 0;i<3;i++){
arr[i] = function(){
console.log(i);
}
}
return arr;
}
var f = a();
f[0]() //3
f[1]() //3
f[2]() //3
/*
当函数a执行完,i的值变成了3,a的作用域链被销毁,数组arr被返回出来,它的作用域链和上面的图是一样的,它里面的每一项都是一个函数的引用,
当调用其中一个函数时,会打印i的值,此时函数里面引用的i的值已经变成了3,所以打印出来的都是3
*/