浏览器的工作原理
当打开一个网站时,为了渲染出网站上的内容,需要做以下几个事情:
1.下载html
2.在下载html的过程中,下载css和js
3.下载完js之后,会停止解析html,去加载js代码,再由js引擎将代码转成机器语言(也就是01010),另一种方法是经过Parse变成AST(抽象语法树),再变成ignation,最后变成字节码,然后变成机器语言
预解析
初始化全局对象:
声明>
执行顺序:声明>函数体>赋值>调用>函数内部的变量提升
当我们查找一个变量时,真实的查找路径是沿着作用域链来查找的
遇到函数如何执行
打印: 20
打印: 10
打印: undefined
打印: 200
打印: undefined 200
打印: undefined 10
打印: a is not defined
注意:上面这个只是在函数中声明的,不会提升到全局变量中
而下面这个函数
打印:20
这两个函数的区别:var和不加var的区别:不加var是变量赋值,并且这个变量变成了全局变量的一个属性
var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。
查找变量路径按照作用域(存放父级作用域以及函数体)
GO:全局对象 : 全局代码执行之前创建GO
AO:活跃对象 : 函数执行之前创建
VO:变量对象 :存放父级作用域以及函数体
VO->GO (全局执行上下文的时候)
VO->AO (函数执行的时候也就是被调用的时候,对函数里面的代码进行编译)
如果在执行上下文的时候,发现变量是一个函数,首先创建一个存储函数空间(也就是函数对象),存储函数空间里面包括父级作用域和函数体,并且给存储函数空间分配一个地址,这个地址指向GO的变量,在函数执行上下文的过程中,VO:AO,因此创建一个AO,里面先声明变量,在执行上下文的过程中,赋值给变量,当之中有函数的时候,再创建一个函数对象出来
内存管理
JavaScript会在定义变量时为我们分配内容
js对于基本数据类型内存的分配(像number、string等)会在执行时,直接在栈空间进行分配
js对于复杂数据类型内存的分配(像对象、数组)会在堆内存中开辟一块空间,并且将这块空间的指针返回值变量引用
函数作为参数的使用
上面这个函数相当于把foo这个函数的返回值返回给了fn,让fn接收返回值
高阶函数:是把一个函数如果接受另外一个函数作为参数,或者该函数会返回另外一个函数作为返回值的函数,那么这个函数就叫高阶函数
函数:独立的function
方法:当我们的一个函数属于某一个对象时,这个函数就是这个对象的方法
闭包
闭包和函数最大的区别:当捕捉闭包的时候,他的自由变量会在捕捉时被确定,这样即使脱离了上下文也会被执行
闭包由两部分组成的:函数+可以访问的自由变量
执行过程(GO、AO、VO)
JavaScript的执行过程(深入执行上下文、GO、AO、VO和VE等概念)_qq_43479892的博客-CSDN博客_js执行过程
this
this的绑定和定义的位置没有关系,跟调用的方式和调用的位置有关
默认绑定
打印:window
打印:window
隐式绑定
显式绑定
显式绑定 - call和apply
call和apply的区别
第一个参数都可以用来指向某一个东西
显示绑定 - bind
优先级
注意:如果语句中有以括号开始的语句,需要在上一个语句中加分号
箭头函数
箭头函数不适用于上面的所有规则,直接找上层作用域
上面的链接后面自带面试题
题目与解析:
剩余运算符和扩展运算符
当三个点(…)在等号左边,或者放在形参上,为 rest 运算符
当三个在等号右边,或者放在实参上,是 spread运算符
rest参数是一个真正的数组,argument对象不是一个真正的数组
argument
array.from()
JavaScript Array.from 详解_淮城一只猫 - iiong.com的博客-CSDN博客
柯里化
个人理解:拆成多个返回值,然后多次调用
formal
对象
存取属性描述符
原型
就是说
function P{
}
var p = new P()
p 对象.__proto__和 P 函数.prototype都指向原型对象同一个原型对象
如果 还有一个函数M也是如上的代码的话
M 函数.prototype = 对象p
则M函数的prototype指向p的__proto__
可以在student中的prototype中找到函数
继承
es6
var、let和const
symbol
set
map
flat
Object.defineProperty
promise
纯回调函数在传递回调函数和异步操作之前必须定义回调函数,但promise把异步和回调拆开了,可以先拿到异步任务执行的结果,再决定拿到结果之后做什么
promise灵活性,即在取得结果后,可以不用立即处理。
resolve方法
finally
allSettled
race