什么是闭包

闭包的概念

闭包是指有权访问另外一个函数作用域中的变量的函数

*在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)
}

 

posted @ 2021-08-23 15:07  来吃点代码  阅读(342)  评论(0编辑  收藏  举报