小白学前端js高级-05

211 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

自学前端

  • 前文
    • 本文是我自学js的一些知识以及个人理解, 希望帮助到一些想要学习前端的小白朋友
    • 介绍本次学习的是js高级相关知识
    • 这是基于我学习的笔记而来的文章
    • backend: 后端 frontend: 前端

作用域

  • 理解
    • 就是一块"地盘", 一个代码段所在的区域
    • ta是静态的(相对于上下文对象), 在编写代码时就确定了
  • 分类
    • 全局作用域
    • 函数作用域
    • 没有块级做用域(ES6有了)
  • 作用
    • 隔离变量, 不同作用域下同名变量不会有冲突

闭包

  1. 如何产生闭包?
    • 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的便量(函数)时,就产生了闭包
  2. 闭包到底是什么?
    • 使用chrome调试查看
    • 理解一: 闭包是嵌套的内部函数(绝大多数人)
    • 理解二: 包含被引用便量(函数)的对象(极少数人)
    • 注意: 闭包存在于嵌套的内部函数中
  3. 产生闭包的条件?
    • 函数嵌套
    • 内部函数引用了外部函数的数据(便量/函数)

执行外部条件

闭包的作用


  1. 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部 变量的生命周期)
  2. 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

问题:

  1. 函数执行完成后, 函数内部声明的局部变量是否还存在?
    • 一般是不存在的, 存在于闭包中的变量才可能存在
  2. 在函数外部能直接访问函数内部的局部变量吗?
    • 不能, 但是我们可以通过闭包让外部操作它

闭包的生命周期

  1. 产生: 在嵌套内部定义执行完成时就产生了(不是在调用)
  2. 死亡: 在嵌套的内部函数成为垃圾对象时(函数提升, 内部函数对象已经创建了)

闭包的应用2 : 定义JS模块

具有特定功能的js文件将所有的数据和功能都封装在一个函数内部(私有的)只向外暴露一个包信n个方法的对象或函数模块的使用者, 只需要通过模块暴露的对象调用的方法来实现对应的功能

闭包的缺点

缺点函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长容易造成内存泄露 解决能不用闭包就不用及时释放(f=null让内部函数成为垃圾对象-->回收闭包)

内存溢出于内存泄露

内存溢出一种程序运行出现的错误当程序运行需要的内存超过了剩余的内存时, 就抛出内存溢出的错误 内存泄露占用的内存没有及时释放内存泄露积累多了就容易导致内存溢出创建的内存泄露意外的全局变量

没有及时清理的计时器或回调函数闭包

后记

  • 希望对对前端有兴趣的朋友们有帮助
  • 这篇文章主要是关于js高级的, 希望大家喜欢
  • js的作者是美国人布兰登·艾奇, 非常厉害的人