function makeAdder(a)
{
return function(b)
{
return a + b;
}
}
var add5 = makeAdder(5);
add5(7);//12
var add20 = makeAdder(20);
add20(10);//30
按照常识,a为局部变量,当函数返回的时候,会被垃圾回收掉。但由于JS作用域对象,返回的对象(函数add*)内部有外部函数的引用(a)所以该作用域对象不会被回收,内部持有对于a=5的引用,也即,add5和add20分别引用不同的作用域对象。可以推=>,闭包就是一层层作用域引用的结果,形成一个作用域链。类似prototype原型链。一层一层外上找。
注:每次调用一个函数时,解释器(顺便回忆一下编译器…)创建一个作用域对象,用来保存这个函数中创建的局部变量。