zoukankan      html  css  js  c++  java
  • javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包

    一、总结

    二、学习要点

    • 掌握匿名函数和闭包的应用

    三、匿名函数和闭包

    匿名函数

    没有函数名字的函数

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

    闭包 闭包的相关概念

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

    注:这些概念了解即可,接下来我们将通过实例来进行了解。

    闭包的相关知识点

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

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

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

    闭包中的this问题

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

    模仿块级作用域

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

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

    私有变量

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

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

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

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

    静态私有变量

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

    • 首先创建私有作用域
    • 定义私有变量或函数
    • 定义构造函数和特权方法
    • 这种方式创建的私有变量因为使用原型而实现共享。
    • 同时由于共享,实例也就没有自己的私有变量。
  • 相关阅读:
    WeakReference(弱引用)
    男人怎么挑选女人
    同步方法和异步方法
    常指针与指针常量的区别(转帖)
    关于WebService的一些注意事项
    ASP.Net缓存技术
    关于GridView手动绑定的一段代码,一切尽在不言中
    基本三层架构的一些代码
    写给自己看的关于DataList的和RePeater
    ASP.Net绑定数据源
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9017662.html
Copyright © 2011-2022 走看看