【JavaScript进阶】匿名函数和闭包

匿名函数

    没有函数名字的函数

    1. 单独的匿名函数是无法运行和调用的
    2. 可以把匿名函数赋值给变量
    3. 通过表达式自我执行,语法:(匿名函数)()
    4. 匿名函数传递参数,语法:(匿名函数)(参数)

闭包

    闭包的相关概念

    • 闭包的英文单词是closure,是指有权访问另一个函数作用域中变量的函数。
    • 在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕。
    • 这是JavaScript中非常重要的一部分知识,因为使用闭包可以大大减少我们的代码量,使我们的代码看上去更加清晰等等,总之功能十分强大。
    • 注:这些概念了解即可,接下来我们将通过实例来进行了解。

    闭包的相关知识点

    1. 常见的方式是在函数内部创建另一个函数
    2. 闭包的第一个用途:通过闭包可以访问局部变量
    3. 闭包的第二个用途:可以让局部变量的值始终保持在内存中
      • 优点:可以把局部变量驻留在内存中,可以避免使用全局变量;

        全局变量在复杂程序中会造成许多麻烦(比如命名冲突,垃圾回收等),所以推荐使用私有的,封装的局部变量。而闭包可以实现这一点。

      • 缺点:由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存;所以过度使用闭包会导致性能下降;
    4. 循环函数中的匿名函数和闭包问题

闭包中的this问题

  • 之前的课程中讲过this是在运行时基于函数的执行环境来绑定的
  • 全局函数中的this是window,而当函数作为某个对象的方法调用时,this就是指的那个对象......
  • 匿名函数的执行环境具有全局性,this通常是指向window的。
    • 可以使用对象冒充强制改变this的指向
    • 将this赋值给一个变量,闭包访问这个变量

模仿块级作用域

    块级作用域又叫私有作用域,但是JS没有块级作用域的概念;这意味着在块语句(比如for语句)中定义的变量,不会因为离开了for块就失效。

    • 使用了块级作用域后,匿名函数中定义的任何变量,都会在执行结束时被销毁;
    • 一般来说,我们都应该尽可能少向全局作用域中添加变量和函数;过多的全局变量和函数很容易导致命名冲突
    • 使用块级作用域,每个开发者既可以使用自己的变量,又不必担心搞乱全局作用域;
    • 在全局作用域中使用块级作用域可以减少闭包占用的内存问题.

私有变量

    JavaScript没用私有属性的概念;所有的属性都是公用的;

    私有变量的概念:在任何函数中定义的变量,都是私有变量,因为不能在函数外部访问这些变量;

  • 私有变量:包括函数的参数/局部变量和在函数内部定义的其他函数;
  • 特权方法:内部创建一个闭包,闭包可以访问私有变量;因此创建用于访问私有变量的公用方法,称作特权方法
  • 可以通过构造方法传参来访问私有变量

    这种方法的缺点是会为每一个实例创建一组新的方法,不能实现共享。

静态私有变量

    通过块级作用域(私有作用域)中定义私有变量或函数,创建对外公共的特权方法;

  • 首先创建私有作用域
  • 定义私有变量或函数
  • 定义构造函数和特权方法
  • 这种方式创建的私有变量因为使用原型而实现共享。
  • 同时由于共享,实例也就没有自己的私有变量。
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注