一道闭包题引起的思考

先看一下这个例子。javascript

function box() {
var a = 1;
return function() {
a++;
alert(a);
}
}
box()();//2
box()();//2
var c=box();
c();//2
c();//3

好久前在知乎碰到了这个问题,当时实在是不知道怎么彻底解释,后来从新翻看《javascript高级程序设计》的时候才恍然大悟。java

个人理解是能够用执行环境来解释。闭包

《javascript高级程序设计》里面有这么一段话:“在js里面当执行流进入一个函数的时候,函数的环境会被推入到一个环境栈里面,函数执行结束后又会将环境弹出。”函数

这样前两个box()()实际上每次执行的时候,函数环境都被推入到栈里面,结束后又会被弹出,首先是box环境被推入栈中,而后里面闭包函数环境推入到栈中,执行结束后会先弹出闭包的环境,再弹出box的环境,因此两个互不影响,都是2。设计

可是c=box()的时候,由于c一直保持着box()的执行,因此box的执行环境一直在栈中,后面两个c()运行的时候,会推入闭包的执行环境,执行c()结束后才弹出闭包的执行环境,实际上box这个执行环境一直还在栈中,因此a就都在同一个执行环境里面了。code

后来我请教了一下在百度工做的师兄,他的解释是这样的:ip

每一个函数的做用域都是独一无二的,函数执行完后里面的东西都会清空,因此box()()执行两次后都是2。作用域

而c,即box(),实际是一直引用着box里面的a变量,因此一直不会被清空。io

这个相似于:function

var a=1;
  function c(){
   a++;
   alert(a);
  }
  c(); //2
  c(); //3
相关文章
相关标签/搜索