博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道闭包题引发的思考
阅读量:5925 次
发布时间:2019-06-19

本文共 706 字,大约阅读时间需要 2 分钟。

先看一下这个例子。

function box(){var a=1;return function(){a++;alert(a);}}box()();//2box()();//2var c=box();c();//2c();//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

转载地址:http://qgavx.baihongyu.com/

你可能感兴趣的文章
jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
查看>>
ARP-Address Resolution Protocol-地址解析协议
查看>>
FFmpeg的HEVC解码器源码简单分析:解码器主干部分
查看>>
C# 解压及压缩文件源代码
查看>>
认识与入门:Markdown
查看>>
std::bind 详解及参数解析
查看>>
nodejs即时聊天
查看>>
Spring Security入门(3-4)Spring Security 异常处理、异常传递和异常获取
查看>>
Android学习笔记(三)
查看>>
13.ThreadPoolExecutor线程池之submit方法
查看>>
10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)...
查看>>
Tushare数据的绘图操作
查看>>
JsonRequestBehavior.AllowGet 方便浏览器调试
查看>>
一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi
查看>>
JavaFX 一 出生新手村(阅读小规则)
查看>>
Mac Ubuntu ----端口被占用
查看>>
运营推广的一些方法
查看>>
CentOS下MySQL忘记root密码解决方法【转载】
查看>>
Highcharts数据表示(3)
查看>>
[Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
查看>>