1.定义:
当一个嵌套的内部函数引用了外部函数的变量或者函数时,外部函数在执行时就产生了闭包
典型的闭包:
1.将函数作为另一个函数的返回值
2.将函数作为实参传给另一个函数调用
闭包特点:
函数嵌套函数,内部函数引用外部函数的变量
闭包的作用:
1.闭包可以延长外部函数的局部变量的生命周期,可以实现计数器,累加器这类
2.可以形成变量的局部作用域,实现函数封装
缺点:
函数定义的变量和数据会一直存在内部函数中,不会被及时释放,这样会导致内存泄漏,解决:尽量不使用闭包;用完后及时释放
计数器实现
1:function createCounter() {
2: let counter = 0
3: const myFunction = function() {
4: counter = counter + 1
5: return counter
6: }
7: return myFunction
8: }
9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
参考链接:blog.leapoahead.com/2015/09/15/…
闭包与循环问题
for(var i=0;i<10;i++){
(function(j){
setTimeout(function(){
console.log(j);
},1000)
})(i)
}
分析:如果不加立即执行函数,会输出连续的10个10,因为 JS 是单线程的遇到异步的代码不会先执行(会入栈),等到同步的代码执行完 i++ 到 10时,异步代码才开始执行此时的 i=10 输出的都是 10。