闭包经典例题分析

322 阅读2分钟

闭包是面试的典型题目

特征

  • 1.函数嵌套函数
  • 2.函数内部可以运用外部参数和变量
  • 3.参数和变量不会被垃圾回收制回收

定义

  • 有权访问另一个函数作用域中的变量的函数
  • 创建闭包最常见的方式是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量

缺点

  • 常驻内存,增大内存使用量,使用不懂很容易造成内存泄漏

应用场合

  • 设计私有的方法和变量

经典例题

function aaa(){
    var a = 1;
    return function(){
        alert(a++)
    };
}
var fun = aaa();
fun();      //1     执行后a++,然后a还在,不会被销毁
fun();      //2  
fun = null;     //      a被回收

常见有关面试题 - 代码分析

1

for(var i = 0;i < 5;i++){
    SetTimeOut(function(){
        console.log(New Date,i)
    },1000);
}
console.log(New Date,i);        // 5 ->(1s后)5,5,5,5,5

代码解读

  • SetTimeOut是异步执行,1s后往任务队列里添加一个任务,当执行完主线上的全部任务,才会执行任务队列中的任务
  • 每一次for循环SetTimeOut执行一次,但是里面的函数并没有执行,只是放在任务队列中等待执行,1s后定时函数执行时,for循环已经结束,i = 5 打印5次
  • for循环后i=5,循环外的打印函数是主线任务,直接执行打印5。1s执行定时函数,打印5个5。

2

for(var i = 0;i < 3;i++){
    SetTimeOut(function(){
        console.log(i);
    }
    ,0);
    console.log(i);     // 0,1,2 -> 3,3,3
}

代码解读

  • for循环开始,每次循环都添加一个定时函数(异步执行),然后打印i(0,1,2),当i=3时循环结束(此时i=3),1s后执行定时函数,打印(3,3,3)