深入理解JS
JS基本概念
1995年,Brendan Eich开发
- 借鉴C语言基本语法
- 借鉴Java的数据类型和内存管理
- 借鉴Scheme语言,将函数提升到“一等公民”的地位
- 借鉴Self语言,基于原型(prototype)的继承机制
单线程
GUI线程和JS线程不能同时执行,互斥。
动态,弱类型,定义变量不需要指定类型
面向对象,函数式
解释型语言
安全,性能差
作用域
静态作用域、动态作用域
js属于静态作用域,通过它预测代码在执行过程中如何查找标识符
变量提升
在执行代码之前,变量和和函数生命会被移动到他们所在作用域的顶部
举例
console.log(str) //undefined
var str='hello'
相当于
var str
console.log(str) //undefined
str= 'hello'
函数
hello() // hello world
function hello(){
console.log('hello world')
}
相当于
function hello(){
console.log('hello world')
}
hello() //hello world
JS是怎样执行的
源代码 -> AST -> 字节码 -> 机器码
当JS 引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文”,也叫执行环境。
词法分析:基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
变量环境:变量环境和词法环境的一个不同就是牵着被用来存储函数声明,而后者只用来存储 var 变量绑定
Other:指向外部变量环境的一个指针
闭包
闭包外的内容会被内存回收,闭包内的内容不会被回收。
this
普通函数的this指向window
对象调用指向对象
先赋值,在调用,看调用的地方
垃圾回收
分代式垃圾回收,v8的垃圾回收策略只要基于分代式垃圾回收机制,V8中将堆内存分为新生代和老生代两个区域
生命周期较长的对象或者空闲区空间占用超过25%,name这个对象就会被移动到老生代空间
新生代回收使用并行回收提高效率,并行回收依然会阻塞进程
事件循环
js代码主要分为两大类:同步代码和异步代码
异步代码又分为:微任务和宏任务