根据作用域链,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),我们将立即处理。