javascript 闭包详解

发表于:2018-7-23 17:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:淘淘笙悦    来源:简书

  根据作用域链,arr[0] 函数会现在自身的变量对象中寻找 i ,如果找不到,会到全局上下文变量对象中寻找 i,所以最终输出 3 。
  arr[1]、arr[2] 的分析与上述一致。
  那么怎么使上述三个函数的输出结果是 0 1 2 呢?
  一个经典的解决方式是通过闭包来实现,代码如下
   
  同样地,在 arr[0] 函数执行前,全局上下文的变量对象跟之前一样没有任何变化。
  而在 arr[0] 被调用执行时,其作用域链在函数上下文的创建阶段被创建,其作用域链如下
   
  可以看到其作用域链发生了变化,arr[0] 的变量对象之后紧跟着匿名函数的变量对象
   
  在匿名函数的变量对象中,能找到访问的变量 i,所以得到 i 值为 0.
  arr[1]、arr[2] 的分析与上述一致,得到的 i 值分别为 1、2 。
  通过闭包,我们能够访问其它函数上下文的变量对象。
  在实践中,闭包的应用场景很多,但其都是依据闭包能够访问其它函数上下文的变量对象的特性。
  闭包能够被应用在模块化中:
   
  如上是通过函数自执行以及闭包实现模块化的一个例子,通过将函数添加到全局对象的方式将方法(这里是闭包)暴露出来,addOne 闭包访问了自执行函数中的变量 a 。
  闭包能够被应用在柯里化中:
  柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
  柯里化的实现方式同样用到了闭包,在这边文章中不做多余的赘述,感兴趣的童鞋可以查阅柯里化的资料。
  闭包的应用场景多种多样,我们可以通过闭包实现许多不同的功能。闭包的魅力,需要我们去理解其本质,并在实践中灵活地应用它。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号