深入理解JS | 青训营笔记

33 阅读4分钟

JS的基本概念

  • 诞生: 1995年,Brendan Eich开发
    • 借鉴C语言的基本语法
    • 借鉴Java语言的数据类型和内存管理
    • 借鉴Schema语言,将函数提升到“第一等公民”的地位
    • 借鉴Self语言,使用基于原型(prototype)的继承机制
  • 发展:
    • Mocha->1995.9 LiveScript->1995.12 JavaScript
    • 1997年6月,第一版ECMAScript发布
    • 1999年12月,第三版ECMAScript发布
    • 2009年12月,第五版ECMAScript发布
    • 2009年,Ryan创建了Node.js
    • 2010年,lsaac基于node.js写出了npm
    • 2015年6月,第六版ECMAScript发布
  • 进程:

  • 特点:
      单线程
      动态、弱类型
      面向对象、函数式
      解释类语言、JIT
      安全、性能差
  • 数据类型:

  • 作用域: 变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合;换句话说,作用域决定了代码区块中变量和其他资源的可见性

  • 变量提升: 在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的行为
 var有变量提升
 letconst没有变量提升、提前访问会报错
 function函数可以先调用再定义
 赋值给变量的函数无法提前调用

JS是怎么执行的

  • 过程:

  • 执行上下文: 当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文”,也叫执行环境
全局执行上下文: 代码开始执行时就会创建,将他压入执行站的栈底,每个生命周期内只有一份
函数执行上下文: 当执行一个函数时,这个函数内的代码会被编译,生成变量环境,词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
  • 调用栈:

  • 词法环境: 基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
  • 变量环境: 变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量绑定,而后者只用来存储var变量绑定
  • Outer: 指向外部变量环境的一个指针
  • 创建了执行上下文时干了什么?
-   绑定this
-   创建词法环境
-   创建变量环境

JS的进阶知识

  • 闭包: 使内层函数可以访问到外层函数作用域
-   创建私有变量
-   延长变量的生命周期
-   会导致内存泄漏,处理速度和内存消耗方面对脚本性能具有负面影响

  • this: 函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象
   -   箭头函数:没有thisthis是继承来的,在定义的时候this就已经确定

  • 垃圾回收: Javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存
    • 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存
    • 通常情况下有两种实现方式:
   标记清除:
        1. 垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉
        1.  在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了
        1.  随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存

   引用计数:

        1. 语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放
        2. 如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏