深入理解JS | 青训营笔记

56 阅读3分钟

0008.深入理解JS | 青训营笔记

[TOC]

一、JS的基本概念

1.诞生

1995年,Brendan Eich开发

  • 借鉴C语言的基本语法
  • 借鉴Jave语言的数据类型和内存管理
  • 借鉴Scheme语言,将函数提升到"第一等公民"( first class ) 的地位
  • 借鉴Self语言,使用基于原型 (prototype)的继承机制

2.发展

  • Mocha ->1995.9 LiveScript -> 1995.12 JavaScript
  • 1997年6月,第一版ECMAScript发布
  • 1999年12月,第三版ECMAScript发布
  • 2009年12月,第五版ECMAScript发布
  • 2009年,Ryan 创建了 Nodejs
  • 2010年,Iaac基于node.js写出了npm
  • 2015年6月,第六版ECMAScript发布

3.特点

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

4.作用域

变量的可访问性和可见性 ==静态作用域==,通过它就能够预测代码在执行过程中如何查找标识符

5.变量提升

  • var有变量提升
  • let、const没有变量提升、提前访间会报错
  • function函数可以先调用再定义
  • 赋信给变量的函数无法提前调用

二、JS是怎么执行的

p9Gz47d.png

当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文(execution context简称EC)”,也叫执行环境。

==全局执行上下文==: 代码开始执行时就会创建,将他压轨行栈的栈底,每个生命周期内只有一份。 ==函数执行上下文==:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出。

==词法环境==:基于ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成。

==变量环境==:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只用来存储 var变量绑定。

==Outer==:指向外部变量环境的一个指针。

三、JS的进阶知识点

1.闭包

2.this

  • 普通函数的this指向window
  • 对象调用指向对象 先赋值再调用,看调用的地方
  • 创建临时对象 将this指向临时对象 执行构造函数 返回临时对象

3.垃圾回收

p9Jp1Gq.png

四、课程总结

1.JS是单线程的,但是Render进程里面有多个线程 2.JS线程和GU线程互斥,执行大的计算任务会导致页面卡顿 3.基础数据类型存在栈上,复杂数据类型存在堆上 4.const、 let没有变量提升,提前使用会报错 5.JS也有编译的过程,执行之前会生成执行上下文 6.一个执行上下文包括变量环境、词法环境、 this 7.变量环境里面有一个指向外部函数执行上下文的指针,形成了作用域链 8.全局执行上下文只有一份 9.this和执行上下文绑定