JavaScript是我们做前端的必要语言,话不多说,让我们跟着青训营老师,深入的了解了解JS,由于本人是前端小白,在听课过程中没有字幕,课程中老师口头叙述的一些专业语言可能打错,欢迎指出,谢谢各位!
一、JS的基本概念
浏览器的进程模型
JS为单线程,浏览器是多进程
进程和线程
进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。
线程被设计成进程的一个执行路径,同一个进程中的线程共享进程的资源**,因此系统对线程的调度所需的成本远远小于进程。
2、JS的基本概念
◆单线程
JS线程和GUI线程是互斥的,JS可以改变页面元素内容,GUI渲染页面时,若JS运行会修改页面DOM,导致渲染出错
◆动态、弱类型
在使用变量前,不需要指定变量类型,即动态、弱类型
◆面向对象、函数式
◆解释类语言、JIT
JS是一个单纯的解释语言吗?是执行一行,解释一行吗?
从下文中的变量提升可以看出,JS并不是纯的解释语言,也是要经过编译
◆安全、性能差
JS执行需要环境,JS执行的环境就是浏览器,其无法访问本地的文件系统,并进行操作,由于JS是解释类型语言,相对于编程类语言,其性能较差。
3、作用域
作用域规定了数据的可访问性和可见性,作用域分为静态作用域和动态作用域,JS为静态作用域,通过静态作用域就能够预测代码在执行过程中如何查找标识符,其实JS作用域也可以成为词法作用域
全局作用域是指其内的变量和函数在全局都可以访问和使用;
函数作用域是指其内的变量和函数只在函数内可以访问和使用;
块级作用域是指在其块内(即花括号内)可以访问和使用;
4、变量提升
var有变量提升;
let、const没有变量提升,提前访问会报错;
function函数可以先调用再定义;
赋值给变量的函数无法提前调用;
二、JS执行
1、执行流程
由于汇编语言在执行简单内容时,需要产生很多代码,如果全部将AST直接转换为机器码,代码量极具增加,会导致内存增大,所以JS会将AST先转换为字节码,在执行时,再由字节码转换为机器码
2、执行上下文
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文( execution context简称EC )",也叫执行环境
一个执行上下文包含变量环境、词法环境、一个THIS、一段可执行的代码、一个outer
·词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法,环境由环境记录器和一个可能的引用外部词法环境的空值组成,简言之放函数和let、const定义的变量
.变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只用来存储var变量绑定,简言之放var定义的变量
. Outer:指向外部变量环境的一个指针