闭包
2016-07-27 本文已影响12人
ninja梅梅
闭包
就是可以让函数访问该函数声明时的作用域内的所有变量和函数。
例如:
![](https://img.haomeiwen.com/i1461711/ea0b1da48a6c52f4.png)
接下来是关于()的有意思的用法。“()”紧跟在函数后面,表示立即调用该函数
例如:
![](https://img.haomeiwen.com/i1461711/5b1c5eb721abd28a.png)
代码定义了一个立即执行函数并返回给counter,这个函数定义了一个局部变量count,返回了一个子函数,该子函数每次调用,都会把count加一并返回,下一次调用时会在上一次调用的基础上加一,可以想象成闭包将保护着count每一次运行的值。
等效于
![](https://img.haomeiwen.com/i1461711/015f4f8260c4373e.png)
![](https://img.haomeiwen.com/i1461711/63af976fc4cc304f.png)
需要避免的问题:
![](https://img.haomeiwen.com/i1461711/d7afbb90dec6e4a7.png)
add_the_handlers函数本意是想传递给每个事件处理器一个唯一的值(i)。也就是每次点击nodes时,输出对应的 i 。但事实上,每次点击nodes,只会在控制台输出相同的值。
这是因为事件处理器函数绑定了变量 i 本身,而不是函数在构造时的变量 i 的值。换句话说闭包中输出的 i 是它所在作用域中的 i 的值,在循环结束后 i 的值变为4。而闭包本身绑定了变量 i ,输出的值会跟随变量 i 的变化而变化,最后输出4。
要使每次点击nodes时,输出对应的 i,可使用下述代码:
![](https://img.haomeiwen.com/i1461711/201f42edde6c2114.png)
这里使用一个立即执行函数并传递当前的 i 值即上面的(i),返回一个新的函数。在这个新生成的函数的闭包中保存了当前的 i 值。这样可以得到想要的结果了。
还有一个和变量提升有关的容易混淆的东西:
![](https://img.haomeiwen.com/i1461711/7ccbb09e7388281c.png)
代码详情可参见我的博客胖胖梅博客JS笔记之闭包