前言
在node的开发过程中异步编程经常会给我们带来一些坑,最常见的还是当回调函数执行的时候输入的参数已经发生改变。
对于刚刚接触异步编程的人来说这个问题用带来很大的困扰。让小猿来介绍介绍如何用闭包解决这个问题吧。
闭包
什么是闭包?
在JavaScript中,实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。
我们都知道作用域上的对象访问只能向上,而不能向下。即函数内可以调用函数外的变量,而函数外部是无法访问函数内部的变量。
闭包利用的是javascript中函数可以作为参数和返回值的特性。
通俗的举个例子:
小明因为某件事惹得父亲非常生气,当他千里迢迢从德国的医院回到家乡十分想知道父亲的气是否消减,但又不能进家门。于是小明就把母亲叫出来询问,父亲的状态。
这就是闭包的原理,无法直接访问到目标变量就通过指向目标变量的内部函数来获取它。
|
|
这里就是通过函数b来访问局部变量,当执行完函数a的时候,内部的局部变量按理来说是会与作用域的销毁而被释放掉的,但这里因为a函数仍然被其他的变量引用着所以不会被销毁,其局部变量也得以保留。
来看看node.js中异步带来的问题
这里定义一个数组和一个含回调的函数
|
|
如果我们想将数组里的元素全部拿出来,按一下写法
|
|
发现和我们预期的差了一大截
原因自然是当打印函数执行的时候,循环已经执行结束了。
如果需要按循序打印出数组的元素,正确的写法应该是:
|
|
结果如下:
其实可以看出来,以上闭包的效果就和java中的构建静态变量是一样的。