闭包定义

有权访问另一个函数作用域中的变量的函数。

  1. function foo(){
  2. var a = 2;
  3. function bar(){
  4. console.log(a);
  5. }
  6. return bar;
  7. }
  8. var baz = foo();
  9. baz();//2--函数中的变量被访问到了,这就是闭包的作用。

在一般情况下,foo();函数在执行后,内部作用域会被销毁,这是由于引擎的垃圾回收机制在释放不需要的内存空间。而闭包则会阻止函数在执行后内部作用域被销毁。

闭包的用途

  • 读取函数内部的变量
  • 让这些变量始终保存在内存中,不会由于函数的调用而被销毁

    闭包的应用场景

    setTimeout

    1. setTimeout的作用是将代码推迟到指定的时间后执行,其实质是setTimeout的机制是等到当前脚本同步的任务或队列事件处理完成后,才将会在指定的时间内执行它。所以如果有setTimeout(f, 0)他表示的是等到当前脚本同步的任务或队列时间处理完成后,再执行它。并不是立即执行。
    1. for (var i = 1; i <= 5; i++){
    2. setTimeout(function timer(){
    3. console.log(i);
    4. },i*1000)
    5. }
    上面代码的结果就是会输出5次6出来,造成上面的原因就是由于回调函数会在循环结束才会执行。

    反思