JavaScript闭包理解

94 阅读1分钟
概念:闭包是指有权访问其他函数作用域的变量的函数。
常见于在函数的内部创建一个函数,创建的函数有权访问当前函数的变量。
-------------------------------------------------
用途:1、创建私有方法和变量,防止变量被全局污染。
     2、防止变量被回收。
--------------------------------------------------
缺点:闭包会常驻内存,容易造成内存泄漏。
解决:在退出函数之前,将不使用的局部变量全部删除,变量=null
---------------------------------------------------
实际场景:1、ajax请求成功后,在闭包中对上级作用域请求的数据的访问。
        2、事件绑定的回调。
        3、设置
-------------------------------------------------------
经典面试题1:
  function fun(n,o) {
    console.log(o)
    return {
        fun:function(m){
        return fun(m,n);
        }
    };
    }
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?//问:三行a,b,c的输出分别是什么?

//答案:
//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1
---------------------------------------------------------
经典面试题2:
/ 经典面试题,循环中使用闭包解决var定义的问题
    for(var i=1;i<=5;i++){
        setTimeout(function timer(){
            console.log(i)
        },i*100)
    }// 6 6 6 6 6
// 首先因为 setTimeout 是个异步函数,所有会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。

答案:
1、闭包:
for(var i=1;i<=5;i++){
    (
        function(j){
            setTimeout(()=>{
                console.log(j)
            },j*100)
        }
    )(i)   
}
2、传入第三个参数
for(var i=1;i<=5;i++){
    setTimeout((j)=>{
        console.log(j)
    },i*1000,i)
}

2、let
for(let i=1;i<=5;i++){
    setTimeout(()=>{
        console.log(i)
    },i*1000)
}