资讯专栏INFORMATION COLUMN

一道闭包题引发的思考

Rindia / 1609人阅读

摘要:高级程序设计里面有这么一段话在里面当执行流进入一个函数的时候,函数的环境会被推入到一个环境栈里面,函数执行结束后又会将环境弹出。而,即,实际是一直引用着里面的变量,所以一直不会被清空。

先看一下这个例子。

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

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

我的理解是可以用执行环境来解释。

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

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

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

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

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

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

这个类似于:

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/50001.html

相关文章

  • 一道闭包引发思考

    摘要:高级程序设计里面有这么一段话在里面当执行流进入一个函数的时候,函数的环境会被推入到一个环境栈里面,函数执行结束后又会将环境弹出。而,即,实际是一直引用着里面的变量,所以一直不会被清空。 先看一下这个例子。 function box(){ var a=1; return function(){ a++; alert(a); } } box()();//2 box()();//2 var ...

    zombieda 评论0 收藏0
  • 一个removeEventListener引发思考

    摘要:而为对象时,可用选项如下之所以第三个参数有两种形态,是在旧版本中只存在一个布尔值,即属性但随着时间推移以及发展的需要,需要支持设置更多的特性设置,所以有了选项这个对象传参,又为了兼容以前的老程序,所以对两者进行了兼容。 起因 最近在看以前的代码时,发现年初在熟悉react hooks新特性时写下了这样一段代码: let i = 0; function Test(props) { c...

    jeyhan 评论0 收藏0
  • 一道面试引发思考 --- Event Loop

    摘要:想必面试题刷的多的同学对下面这道题目不陌生,能够立即回答出输出个,可是你真的懂为什么吗为什么是输出为什么是输出个这两个问题在我脑边萦绕。同步任务都好理解,一个执行完执行下一个。本文只是我对这道面试题的一点思考,有误的地方望批评指正。 想必面试题刷的多的同学对下面这道题目不陌生,能够立即回答出输出10个10,可是你真的懂为什么吗?为什么是输出10?为什么是输出10个10?这两个问题在我脑...

    betacat 评论0 收藏0
  • 一道笔试引发思考

    摘要:前两天做了一份笔试题按照执行顺序列出下面代码的打印内容可能有些小朋友会被里面那个立即执行函数吓傻。和将指向改变至,也就是了。 前两天做了一份笔试题:按照执行顺序列出下面代码的打印内容 var name = The Window; var object = { name : The Object, getNameFunc : function(){ (()...

    soasme 评论0 收藏0
  • 一道前端面试引发思考

    摘要:直接开始题目是厉害了说句实话开发中谁写成这样保证会被打死。不过面试就是面试,有面试官的考量点。官方是这么说的。结果完美,不过小姐姐的意思是数组的方法会自动触发数组的。 直接开始题目是 if(a==1 && a==2 && a==3){ alert(厉害了) } 说句实话开发中谁写成这样保证会被打死。 不过面试就是面试,有面试官的考量点。 我理解的点有两个 1、隐式类型转换 先说...

    gaomysion 评论0 收藏0

发表评论

0条评论

Rindia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<