深入理解JS | 青训营笔记

85 阅读4分钟

三大内容:

graph TD
JS的基本概念 --> JS是怎么执行的-->JS的进阶知识点

JS基本概念:

JS的诞生于1995年,Brendan Eich 开发

1.借鉴了C语言的基本语法。

2.借鉴了JAVA语言的数据和内存管理

3.借鉴Scheme语言,将函数提升第一地位

5.借鉴Self语言,使用基于原型(prototype)的继承机制。

JS的发展:共有六版。

JS主要分四个继承:Browser进程、GPU进程、渲染进程、插件进程,网络进程。

渲染进程又细分:

graph TD
渲染进程 --> GUI线程
渲染进程 --> JS线程
渲染进程 --> 事件触发线程
渲染进程 --> 定时器触发线程
渲染进程 --> 网络线程

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

JS的数据类型:数据类型包括对象和基础类型方面,其中对象里含有数组、函数等。基础类型含有字符串、数字、undefined、null、symbol、bigInt、布尔类型等

JS作用域 作用域是指程序源代码中定义变量的区域,作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

静态作用域:通过它就能预测代码在执行过程中如何查找标识符

补充:> *作用域链

当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套

首先,JS引擎从当前的执行作用域开始查找变量。
然后,如果找不到,引擎会在外层嵌套的作用域中继续查找。
最后,直到找到该变量,或抵达最外层的全局作用域为止 *

1.词法作用域 

词法作用域就是定义在词法阶段的作用域,简单说就是函数的作用域在函数定义的时候就决定了,

而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。

2.函数作用域

函数作用域内的变量或者内部函数,对外都是封闭的,从外层的作用域无法直接访问函数内部的作用域,否则会报引用错误异常。解决方法:闭包。

3.全局作用域

最外层的全局作用域,任何地方都可以访问得到。在最外层作用域下使用 var 关键字会定义全局变量,也就是说会挂载在 window 对象上,或者不使用关键字 var、let、const 直接对变量名字进行赋值,JS也会自动为其创建为全局变量。

4.块级作用域

块级作用域指在代码块 {} 里面定义的变量,只会在当前代码块有效,如果外层作用域下想访问该变量,会报引用错误异常。

使用关键字 let 或 const 定义块级作用域的变量。

JS的变量提升

  1. var有变量提升
  2. let、constant没有变量提升,提前访问会报错
  3. function函数可以先调用然后再定义
  4. 赋值函数给变量的函数无法提前调用

执行过程:

graph TD
一段JavaScript的代码 --> 编译阶段-->执行阶段

JS怎么执行

graph TD
源代码 --> AST-->字节码-->机器码
源代码-->执行上下文
源代码的  词法分析   是指向AST,语法分析是指向  执行上下文。
字节码在转换机器语言,有两个方式执行过程:1.编译执行,达到优化代码的一个效果;2.逐行解释
执行

当JS引擎解析到可执行代码时(一般是函数调用)的时候,就会先做一些执行签的准备工作————执行上下文(EC),也叫执行环境。 执行上下文中分词法环境和变量环境,Outer是指向外部变量环境的一个指针。

JS的进阶知识

1.闭包

2.this

3.垃圾回收:分为标记和清除两个阶段
标记阶段,垃圾回收器会从根对象开始遍历。每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。
清除阶段,垃圾回收器会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。