什么是闭包
闭包的概念
闭包是指有权访问另外一个函数作用域中的变量的函数
*在js中,目前只有全局作用域,局部(函数)作用域,块级作用域(let,const)
*按照字面上理解,其实就是一个函数内部能够使用另外一个函数的局部变量
闭包有个问题就是内存泄漏,所以不能滥用闭包
但是相应的,这也是判断是否是闭包的一个依据
1,是否能读取外部作用域的变量
2,是否保存(没有被回收)该变量
闭包常见的案例
1,返回一个函数
function f1(){ var a=2 return function(){ console.log(a) } } let f3=f1() f3()//2
2,高阶函数(函数作为参数传递)
function f1(){ var a=2 function f2(){ console.log(a) } bar(f2) } function bar(fn){ fn() } f1()//2
3,使用了回调函数
function f1(f2){ var a=2 f2?f2(a):'' } f1(function(xx){ console.log(xx) })//2
4,立即执行函数
for(var i=0;i<10;i++){ (function(){ let j=i setTimeout(function(){ console.log(j) }) })() } //经过简写后 for(var i=0;i<10;i++){ (function(j){ setTimeout(function(){ console.log(j) }) })(i) }
经典面试题
解决for循环+setTimeout返回的结果都为同一个值的办法
1,闭包
for(var i=0;i<10;i++){ (function(j){ setTimeout(function(){ console.log(j) }) })(i) }
2,块级作用域
for(let i = 1; i <= 5; i++){ setTimeout(function timer(){ console.log(i) },0) }
3,setTimeout的自带回调(其实也是闭包)
for(var i=1;i<=5;i++){ setTimeout(function timer(j){ console.log(j) }, 0, i) }