JS基本概念
JS特点
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言、JIT
- 安全、性能差
为什么说JS是单线程的?
GUI线程和JS线程是互斥的。JS可以改变页面元素的背景、位置等,若JS线程和GUI线程同时运行,则会修改DOM树,渲染的效果可能就不如人意了。
动态、弱类型
在定义变量的时候不必声明它时何种类型的,并且随时可以变化。
面向对象、函数式
JS是面向对象、函数式的混合式编程语言。
安全、性能差
执行js需要附属环境,这个附属环境一般为浏览器,并不能访问文件系统,也不能执行底层操作。JS是边解释边执行的,因此性能稍差。
数据类型
数据类型分为基本数据类型、复杂数据类型。
区别
- 基本数据类型赋值、复杂数据类型赋地址
- 变量加上const后,基本数据类型变量的值不能被改变、复杂数据类型的值能被改变
作用域
作用域分为静态作用域和动态作用域,JS是静态作用域(词法作用域)。
静态作用域,通过它就能够预测代码在执行过程中如何查找标识符。简单来说作用域就是变量能被识别的范围。JS有三种作用域,ES6前有全局作用域,函数作用域;ES6后新增一个块级作用域。
变量提升
- js不是纯解释型语言,也是会进行编译的。
- var有变量提升,没定义前使用变量不会报错,而是会显示一个undefined。
- let、const没有变量提升,提前访问会报错。
- function函数可以先调用再定义。
- 赋值给变量的函数无法提前调用。
JS是怎么执行的?
执行上下文
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文( execution context简称EC ) ",也叫执行环境。下面是执行上下文的组成。其中outer又包含全局执行上下文,函数执行上下文,Eval执行上下文。
- 全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
- 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈页弹出
创建上下文时做了什么操作?
绑定this、创建词法环境、常见变量环境
- 词法环境:基于ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
- 变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只用来存储var变量绑定
- Outer:指向外部变量环境的一个指针
进阶
有时间会继续更新哒!
闭包
本质为没有被回收的对象
this
垃圾回收
堆 新生代: