在定义函数时就创建了一个作用域链并保存在函数的scope属性中,当调用函数时,会为函数创建一个执行环境,并通过复制scope属性中的对象(变量对象)构建起执行环境的作用域链,并创建该函数的活动对象(可做变量对象)放入作用域链的前端,因此更内层的函数的作用域链会被重新定义,而闭包则是内层函数被更外部的变量对象引用,而内层函数又引用了定义它的环境的活动对象
function getCounter(){
var n = 0;
return function(){return ++n} //匿名函数在getCounter开始执行时并不存在在内存中
}
var getNum = getCounter();
当程序读到return 后的匿名函数时,就会创建一个函数对象,并在内存中生成一个地址,最后return给getNum的是一个地址;因为该匿名函数的地址被全局变量保存,该函数也就被引用了,所以不再是匿名函数,最后该函数的作用域链,函数对象,和对getCounter函数的活动对象的引用都能被保存下来;
匿名函数的优点:节约内存空间 // 匿名函数被读到了就创建2大对象(函数对象、作用域链对象)。
匿名函数只在调用时三大对象。函数对象和作用域链对象,读完后因为没变量保存函数对象的地址,函数对象就被销毁,因而作用域链也不能被保存下来;所以调用后三大对象都自动释放。