闭包就是能够读取其他函数内部变量的函数。
闭包有三个特点:
- 函数嵌套函数。
- 函数内部可以引用外部函数的参数和变量。
- 这个参数和变量不会被垃圾回收机制回收。
比如想要实现一个函数,每次调用的时候,函数内的变量实现加1。
以下函数,每次调用fn,得到的a都是11 。这是因为每次调用的时候,都会重新声明a:
function fn(){ var a = 10; a++; console.log(a); } var f = fn(); f(); f(); f(); f();
以下函数,虽然实现了,但是a就变成了全局变量,会造成全局变量命名空间的污染。
var a = 10; function fn(){ a++; console.log(a); } var f = fn(); f(); f(); f(); f();
所以,这个时候,我们需要闭包实现:
function addOne(){ var a = 10; // a是局部变量,使用闭包后,a进化成addOne或者fn的私有(自由)变量,在函数外面可以操作a的值,每次进行加1 function fn(){ a++; console.log(a); } return fn; } var f = addOne(); // addOne只执行一次,var a = 10只执行一次,只定义了一次 f(); // 11 每次执行fn,a都会加1 f(); // 12 f(); // 13 f(); // 14
一个经典的for循环例子,最终输出三个3:
for(var i=0; i<3; i++){ setTimeout(function (){ console.log(i); }, 0) }
可以用闭包实现输出0、1、2效果:
for(var i=0; i<3; i++){ (function(i){ setTimeout(function (){ console.log(i); }, 0) })(i); }
闭包的优点:
1 可以使一个变量长期存储在内存中。
2 避免污染全局变量。
闭包的缺点:
1 变量常驻内存,增加内存使用量。
2 使用不当容易造成内存泄露。
转载: