前言
本文主要面向刚刚入门的前端同学,主要讲述了JS的整体发展及一些比较重要的知识。其中通过一些简单的代码讲述了变量提升、JS的数据是怎么存储的、基础数据类型和复杂数据类型的区别等一些基础知识,也讲解了JS的执行、闭包、垃圾回收等一些稍微进阶一些的知识,希望大家能有所收获
1.JS的基本概念
JS诞生和发展
诞生:1995年,Brendan Eich开发
- 1.借鉴C语言的基本语法
- 2.借鉴Java语言的数据类型和内存管理
- 3.借鉴Scheme语言,将函数提升到“第一等公民”(first class)的地位
- 4.借鉴Self语言,使用基于原型(prototype)的继承机制
发展:
- 1.Mocha->1955.9 LiveScript->1995.12 JavaScript
- 2.1997年6月,第一版ECMAScript发布
- 3.1999年12月,第三版ECMAScript发布
- 4.2009年12月,第五版ECMAScript发布
- 5.2009年,Ryan创建了Node.js
- 6.2010年,Isaac基于node.js写出来npm
- 7.2015年6月,第六版ECMAScript发布
浏览器进程模型
JS特点
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言、JIT
- 安全、性能差
- ......
数据类型
- 基础类型是不可变的
- 复杂数据类型,原始值是可变的
作用域
- 变量的的可访问性和可见性
- 静态作用域,通过它就能够预测代码在执行过程中如何查找标识符
变量提升
2.JS是怎么执行的
JS执行流程图
AST
执行上下文
- 全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
- 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
调用栈
创建执行上下文做什么?
- 绑定THis
- 创建词法环境
- 创建变量环境
词法环境、变量环境、Outer
作用域链
变量环境、堆空间
- 引用对象保存在堆空间中,即存的是地址
ESP
3.JS的进阶知识点
闭包
- 通常,如果引用闭包的函数是一个全局变量,那么闭包会一直存在直到页面关闭,但是如果这个闭包以后不再使用的话,就会造成内存泄漏。
- 如果引用闭包的函数是一个局部变量,等函数销毁后,在下次JavaScript引擎执行垃圾回收时,判断闭包这块内容如果已经不再被使用了,那么JavaScript引擎的垃圾回收器就会回收这块内存
this
垃圾回收
4.总结
- 1.JS是单线程的,但是Render进程里面是有多个线程
- 2.JS线程和GUI线程互斥,执行大的计算任务会导致页面卡顿
- 3.基础数据类型存在栈上,复杂数据类型存在堆上
- 4.const、let没有变量提升,提前使用会报错
- 5.JS也有编译的过程,执行之前会生成执行上下文
- 6.一个执行上下文包括变脸环境、词法环境、this
- 7.变量环境里面有一个指向外部函数执行上下文的指针,形成了作用域链
- 8.全局执行上下文只用一份
- 9.this和执行上下文绑定
引用
- 字节内部课:深入理解JS-字节前端初阶训练营