前置知识 浏览器 之所以能运行代码,是因为底层提供了环境
- 执行环境栈(ECStack),栈内存就是计算机中分配出来的一块内存。
- 代码执行分为:全局代码,函数代码,私有块中的代码
- VO(G)变量对象存储当前上下文中创建的变量
- EC(G)全局执行上下文
- VO(G)全局变量对象
- 基本类型是按照值操作的,引用数据类型是按照地址来操作
函数执行就是把堆里存放的代码字符串拿过来执行,形成一个新的私有上下文,代码执行之前,需要:
- 初始化作用域链
- 函数上下文遇到变量,首先看是否为自己私有的,如果是自己私有的,则接下来的操作,都是操作自己私有的,和其他上下文没有任何直接关系,如果不是自己的私有变量。则按照作用链,向上级上下文中查找...如果上级也没有,一直找到全局为止。如果全局也没有,设置值,给window设置,获取值操作,报错。
- 初始化this指向 5种情况
- 构造函数中的this是当前类的实例
- 基于call/apply/bind 强制改变this的指向
- 箭头函数没有this,用到的this都是上下文中的this
- 给当前元素的某个事件行为绑定方法,事件触发,执行对应的方法,方法中的this是当前元素本身
- 函数执行,首先看函数名之前是否有点,有点,点前面是谁,this就是谁,没有点,this是window
- 初始化arguments
- 初始的arguments和形参建立一个‘映射’,并且,映射只在这个阶段建立,arguments集合中的每一项对应相同位置的形参
- 形参赋值 +
- 变量提升
- 代码执行
一般情况下,函数执行完之后,就出栈释放掉了,但是遇到当前函数里的东西被当前上下文以外的上下文占用,就形成了闭包。