JS学习——闭包

141 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

上章我们介绍了作用域,知道了局部变量不能在全局作用使用,同时作用域遵循就近原则,函数中的变量会使用的到全局变量。如果不想局部变量受到影响就需要用到闭包。

定义

闭包简单来说就是形成了一个不会被回收的环境,将函数里的变量私有化,闭包用处非常广泛,比如:定时器等就是闭包函数,闭包是必须要掌握的知识点。

生成闭包

根据作用域的特点,我们可以来想一下怎么实现一下闭包,首先函数是局部作用域,我们把变量声明到局部作用域,然后在嵌套一个局部作用域,在嵌套的局部作用域使用声明在外面的局部作用域的变量,根据就近原则,嵌套函数不会受到script文件中同名变量的影响。总结起来:

  • 函数嵌套一个函数,并将里面的函数当作返回值。
  • 里面的函数参数是外面的。
    var a = '2';
    function f1() {
      var a = '1';
      function f2() {
        console.log(a);//1
      }
      f2();
    }
    f1();

如果我们把局部变量a去掉的话,此时f2里面打印的就是'2'。

优缺点

优点

  • 变量私有化,闭包最重要的就是实现了变量的私有,不必担心变量会被回收
  • 实现全局作用域使用局部变量。正常函数这么做会报错:
    function f1() {
      var a = '1';
    }
   console.log(a)//Uncaught ReferenceError: a is not defined

利用闭包我们从函数外获取到局部变量。

   var closure =  (function () {
      var a = '1';
    function f2(){
        return a
      }
      return{
        f2
      }
    })()
   console.log(closure.f2())//1

缺点

可能造成内存泄漏,正是因为闭包会将变量保存起来,不会被垃圾回收机制回收,当闭包用的过多时,内存越老越大就会溢出。所以闭包一定不能滥用,用完的局部变量也可以及时删除减少内存。

总结

闭包能够将变量私有化,形成不会销毁的环境,利用闭包我们可以在全局作用域访问并使用局部变量。通过作用域,我们可以很轻松地理解闭包,闭包很有用但也要注意不要滥用,防止内存泄漏。