1 JS的基本概念
浏览器就是多进程的,每打开的一个浏览器窗口就是一个进程,进程是cpu资源分配的最小单位,进程可以包含多个线程。
渲染进程主要包括:GUI线程(绘制页面内容),JS线程(执行js),事件触发线程,定时器触发线程,网络线程等
js为单线程,与GUI线程互斥;js是动态弱类型语言(声明变量时不需要指定类型);面向对象(不是纯面向对象),函数式(参数指向结果);js安全(附属环境是浏览器,不能访问本地的系统),性能差。
1.1 数据类型
复杂数据类型与基本数据类型的区别:
1.复杂数据类型赋值的是地址,基础数据类型赋值的是原始的值
2.复杂的数据类型原始的值是可以被改变的,基础数据类型是不可以被改变的
1.2 作用域 ES6之前只有两种:全局作用域和函数作用域,除此之外还有一个块级作用域
块级作用域第二个log输出报错。
1.2 变量提升 var和函数有变量提升(先把没赋值的var提到前面去;函数是把整个函数都提到前面去,但不能赋值给变量如下图所示),let和const没有变量提升
2 JS如何执行
重点:执行上下文
创建执行上下文时,绑定了This,创建了词法环境,创建变量环境
词法环境放函数,let,const定义的变量,变量环境放var
Outer指向外部变量环境的一个指针
一层一层往外找时形成作用域链
改的堆空间里的内容,地址不变
3 js进阶
3.1闭包
showName即使执行完,但是里面闭包的内容是没有被回收的
3.2 This 普通函数里的this指向的是window(包括嵌套)
对象调用时指向对象,如下图所示:
输出为:zq
改变this指向可以用apply,call,bind等
先赋值再调用,看调用的地方
3.2 垃圾回收
栈的垃圾回收:ESP指针弹到下一个,上面就变成无效的内存,分配时就被覆盖掉了
堆的垃圾回收:
(1)新生代空间(副垃圾回收器)
在对象区域(活跃的对象和变量),先作垃圾标记,标记后将活跃的对象和变量复制到空闲区域去,再将区域翻转,再将翻转后的空闲区域清掉,即完成一次垃圾回收
(2)老生代空间(主垃圾回收器)
老生代空间比较大;将新生代回收后还没被回收掉的垃圾放到老生代中
先内存标记,标记之后清除,再做内存整理
全停顿:标记清理到清除后的状态的停顿,即耗时非常长,所以主垃圾回收器就会把债务分成碎片任务
3.3 js事件循环
先微任务,再宏任务;即先执行一个宏任务中的微任务,微任务执行完之后再执行那个宏任务。
4 课程总结