Javascript 中一个最重要的特性就是闭包的使用。因为闭包的使用,当前作用域总可以访问外部的作用域。因为 Javascript 没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的。@H_404_1@
模拟私有变量
@H_404_1@ 代码如下:
@H_404_1@
这里 Counter 返回两个闭包:函数 increment 和 get。这两个函数一直保持着对 Counter 作用域的访问,因此它们能一直访问到定义在 Counter 作用域的变量 count。@H_404_1@
私有变量的工作机制
@H_404_1@由于 Javascript 不可以对作用域赋值和引用,所以在上例中,是没有办法在外部直接访问内部私有变量 count。唯一的方法就是通过定义闭包来访问。@H_404_1@
代码如下:
3012">
var foo = new Counter(4);
foo.hack = function() {
count = 1337;
};
@H_404_1@
上面的代码不会改变 Counter 作用域内的 count 变量值,因为 hack 没有在 Counter 内定义。上面这段代码只会创建或者覆盖全局变量 count。@H_404_1@
循环内的闭包
@H_404_1@ 代码如下:
@H_404_1@
上面这段代码不会输出0到9,而是连续输出10次10。 上面的匿名会一直保持一个对变量 i 的引用。当调用 console.log 函数开始输出时,这是循环已经结束,而变量 i 已经为10了。 为了避免上面的错误发生,我们需要在每次循环时为变量 i 值创建一个拷贝。@H_404_1@
避免引用错误
@H_404_1@为了复制循环中变量的值,最好的方式是在外层加一个匿名的立刻执行函数。@H_404_1@
代码如下: