闭包的作用: 正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的 变量,在函数执行完之后依旧保持没有被垃圾回收处理掉
1、正常的for循环打印
for (var i = 0; i < 4; i++) {
console.log(i);
输出的是0、1、2、3
2、加了延迟的for循环打印
for (var i = 0; i < 4; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
输出的是4、4、4、4
这里有了延迟,跟js的事件循环机制有关系:相关文章:https://blog.csdn.net/Sunday97/article/details/99945348
3、运用闭包解决上述问题
方法一:
for (var j = 0; j < 4; j++) {
setTimeout((function(j) {
return function() {
console.log(j)
}
})(j),1000)
}
输出0、1、2、3
解析:其中的 return function() {console.log(j) }是一个闭包,用来获取setTimeout方法里面的function函数的参数j,并会将每一个j的值保存下来,当轮到里面的输出函数执行的时候就自然输出的是当时的j的值
方法二:
for (var j = 0; j < 4; j++) {
var temp = j;
setTimeout((function(temp) {
return function() {
console.log(temp)
}
})(temp),1000)
}
该方法和方法一类似
方法三:
for(var j = 0;j < 4;j++){
(function(val) {
setTimeout(function(){
console.log(val)
},1000)
})(j)
}
解析:该方法是setTimeout里面的函数参数是一个闭包,它的父函数是一个立即执行函数,闭包函数会保存立即执行函数里面传入的j的值,最后一次输出
闭包的缺陷:
通过上边的例子也发现, 闭包会导致内存占用过高,因为变量都没有释放内存