【Js基础】函数的执行流程

47 阅读2分钟

前置知识 浏览器 之所以能运行代码,是因为底层提供了环境

  • 执行环境栈(ECStack),栈内存就是计算机中分配出来的一块内存。
  • 代码执行分为:全局代码,函数代码,私有块中的代码
  • VO(G)变量对象存储当前上下文中创建的变量
  • EC(G)全局执行上下文
  • VO(G)全局变量对象
  • 基本类型是按照值操作的,引用数据类型是按照地址来操作

image.png 函数执行就是把堆里存放的代码字符串拿过来执行,形成一个新的私有上下文,代码执行之前,需要:

  • 初始化作用域链
    • 函数上下文遇到变量,首先看是否为自己私有的,如果是自己私有的,则接下来的操作,都是操作自己私有的,和其他上下文没有任何直接关系,如果不是自己的私有变量。则按照作用链,向上级上下文中查找...如果上级也没有,一直找到全局为止。如果全局也没有,设置值,给window设置,获取值操作,报错。
  • 初始化this指向 5种情况
    • 构造函数中的this是当前类的实例
    • 基于call/apply/bind 强制改变this的指向
    • 箭头函数没有this,用到的this都是上下文中的this
    • 给当前元素的某个事件行为绑定方法,事件触发,执行对应的方法,方法中的this是当前元素本身
    • 函数执行,首先看函数名之前是否有点,有点,点前面是谁,this就是谁,没有点,this是window
  • 初始化arguments
    • 初始的arguments和形参建立一个‘映射’,并且,映射只在这个阶段建立,arguments集合中的每一项对应相同位置的形参
  • 形参赋值 +
  • 变量提升
  • 代码执行
    一般情况下,函数执行完之后,就出栈释放掉了,但是遇到当前函数里的东西被当前上下文以外的上下文占用,就形成了闭包。