JavaScript 面试必考【闭包】

垃圾回收方法

  1. 标记清除(mark and sweep)

    ​ 这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了

  2. 引用计数(reference counting)
    在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间

闭包

  • 封闭的空间+函数和外部变量,包裹在一起

  • 闭包导致的现象:该销毁的变量没有被销毁

  • 广义闭包:在JS中每当生成函数,就会生成闭包

  • 狭义闭包:

    1. 函数套函数
    2. 内部函数访问外部函数的自由变量
    3. 内部函数被调用
  • 广义上讲闭包就是内存泄漏;狭义上闭包就是用完忘记回收清理的

    闭包的作用

    1. 模块化开发:防止命名污染

    2. 共享变量

    3. 做缓存

    4. 私有化变量

      优点:扩大变量作用范围,延长变量作用时间,减少了命名污染

      缺点:浪费内存导致内存泄漏

猜你喜欢

转载自blog.csdn.net/lyf976229437/article/details/107084653
今日推荐