前面作用域和作用域链的讲解,为我们理解闭包建立了基础
闭包的原理就是:子函数携带其上级作用域链(父函数的AO)返回到父函数的上级作用域并储存
例子:
<script>
function father(){
var num = 0;
var add1 = function(){
console.log(++num);
}
return add1;
}
var adder = father();
adder(); //->1
adder(); //->2
</script>
在上面例子中,在全局预编译阶段,父函数father,变量adder被存入GO中;然后开始执行,首先调用father函数并将输出结果赋值给adder,而father函数的输出的是其子函数add1。add1在定义时就存储father的AO的地址,因此add1被返回到GO时也就携带了father的AO,里面有变量num,而函数father在执行完毕后其AO会销毁(及其作用域链中不再保存其AO,下一次调用该函数时会重新创建AO),因此这个被子函数携带出去的AO作用域就只属于这个函数了。这就叫闭包。可以有效降低环境变量污染。