闭包

关于闭包
定义:一个函数内部嵌套另一个函数,内部的函数引用了外面函数的局部变量,这样就形成了一个模型,叫做闭包
闭包的作用是保护变量(变量私有化)缓存数据
闭包会占用内存,闭包的内存是不会自动释放的!!!
1.统计一个函数的执行次数
var count = 0;
function fn() {
count++;
console.log('我执行了' + count + '次');
};
fn();
fn();
fn();
这样虽然可以实现效果,但count是全部变量,可能会受到污染,这样就会影响结果,而我们用闭包的写法就是如下:
function outer() {
var count = 0;
function inner() {
count++;
console.log('我执行了' + count + '次');
};
return inner;
};
var result = outer();
result();
外面用outer函数将整个包裹起来,内部的函数inner引用了outer中的count,也就形成了闭包,保护了变量。闭包的内存是不会自动释放的,也就让count一直累加
经常遇到的一些闭包写法
点击按钮, 打印对应按钮的下标
1.
var btns = document.querySelectorAll('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function (i) {
return function () {
console.log(i);
};
})(i);
}
代码开始一行一行的执行,for循环中,当i=0时,btns[i].onclick后面的自调用函数也会执行,产生一块内存空间
因为自调用函数内部的函数引用了自调用函数的i值,形成了闭包,这块内存空间不会自动释放,且同时也保护了自调用函数
内的局部变量 i的值,for循环中i每执行一次都是开辟了一个新的内存空间,最终结果也就能打印出对应的下标
2.
var btns = document.querySelectorAll('button');
for (var i = 0; i < btns.length; i++) {
(function (i) {
btns[i].onclick = function () {
console.log(i);
};
})(i);
}
这种写法原理上和上一个写法是一样的,当for循环开始执行,每执行一次,内部的自调用函数也会执行
当然自调用函数的内部函数引用了自调用函数的局部变量i,也就形成闭包,内存不会自动释放,同时保护了局部
变量i不受影响,for循环结束,随之产生了对应个数的闭包,也能得到我们想要的结果。
原文地址:https://www.cnblogs.com/z-lin/p/10920889.html