课程介绍
本课程主要面向刚刚入门的前端同学,主要讲述了JS的整体发展及一些比较重要的知识。其中通过一些简单的代码讲述了变量提升、JS的数据是怎么存储的、基础数据类型和复杂数据类型的区别等一些基础知识,也讲解了JS的执行、闭包、垃圾回收等一些稍微进阶一些的知识,希望大家能有所收获
课程重点
- JS的基本概念
- JS的数据类型
- 变量提升
- 作用域
- 闭包
- 垃圾回收
本节课我们着重讲渲染进程
gui线程是绘制页面的,js线程是运行js的,js是可以改变页面元素的,所以gui和js是互斥运行的
js是解释类语言 但是真的是写一行解释一行吗?
在js中,复杂的数据类型赋值的是地址,基础的数据类型赋值的是值
js的编译器会先把var声明的变量读出来,所以先用变量后声明不会报错但是undefiend。而函数是把整个函数都读出来,所以可以先用函数后声明,所以js不是纯解释语言
热代码:重复出现多次的代码会被存起来方便直接使用
js执行过程:
全局商家问:代码开始执行时就会创建,将它压执行栈的栈底,每个生命周期内只有一份
函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
词法环境用来放let和const定义的变量,变量环境用来放var定义的变量,outer是指向外部环境的指针
esp指针记录当前执行状态,刚才的线程就变成了无效内存等待被下一个线程覆盖掉
调用已经出栈的函数会产生闭包,闭包内存不容易被回收,因为他会跟随调用它的函数一起完成这个生命周期
函数的this指向调用它的东西,对象的this指向对象,因此只要用apply(对象)就可以调用其他对象里的属性了,构造函数的this指向创建的临时对象
垃圾回收分为堆垃圾和栈垃圾,堆垃圾就是上面说的无效内存替换方式,栈垃圾就是下面这个方式:
栈垃圾分两类,新生代和老生代,新生代比较小,放的都是新定义的变量,老生代放的是新生代进行多次垃圾回收之后仍留下来的变量和一些初始就比较大的变量,新生代的垃圾回收分为三部,1,在对象区域进行标记,标记垃圾数据和活跃数据,2,将活跃的数据复制到空闲区域,3反转两个区域。 老生代的垃圾回收大致相同:把垃圾进行标记然后进行清除操作,最后把碎片化的内存进行合并。需要注意的是:进行垃圾回收的时候js是停止运行的,不然一边产生垃圾一边清除会出错
总结