Skip to content

执行上下文

  • 概念

    • 当前javascritp代码被解析和执行时所在环境的抽象概念
  • 类型

    • 全局执行上下文:全局的js代码被首次加载时创建,浏览器的全局对象是window
    • 函数执行上下文:函数被调用时创建
    • eval函数执行上下文:eval函数调用时创建,现在很少用(性能较低)、

执行上下文栈

​ 一种数据结构,存储了代码在执行期间创建的所有执行上下文,用于管理执行上下文,当全局代码加载时,会创建一个全局执行上下文并压入栈(LIFO)中,当函数调用时会创建一个函数执行上下文并压入栈中,当函数执行完成,函数执行上下文会从栈中弹出,当程序结束(关闭浏览器窗口)全局执行上下文会从栈中弹出

变量对象

  • 概念

    完整的执行上下文分为两个阶段,分为进入执行上下文阶段和代码执行阶段,进入执行上下文会创建变量对象,存储了当前执行上下文中变量、函数的声明,变量对象由js引擎内部实现,实际上js环境中访问不到

  • 进入执行上下文(全局上下文中的变量对象指向js客户端的全局对象window )

    创建变量对象,会把函数内部的形参、函数声明、变量声明放入变量对象中

    function fn(a,b){
    	var c=1
    	funcion d(){}
    	var e=function(){}
    }
    fn(10,20)
    //变量对象伪代码
    const OA={
    	arguments:{
        a:10,
        b:20
       },
       c:undefined, 
       d:function(){},
       e:undefined
    }
  • 执行代码

    const OA={
    	arguments:{
        a:10,
        b:20
       },
       c:1, 
       d:function(){},
       e:function(){}
    }

    浏览器垃圾回收机制

    • 引用计数(当代浏览器基本不用)
      • 在堆内存中找所有对象,如果对象有被引用则会做一个标识,没有被引用会认为该对象没用,每一轮下来,被标记的对象的内存会保留着,没被标记的对象的内存会被释放掉
      • 存在的最大的弊端,当多个对象相互引用时,多个对象会长期驻留在内存中,容易造成内存泄漏,IE老版本中会存在这个问题
    • 标记清除(常用)
      • 会在根部(全局对象)找可到达的对象,如果可以直接触及内存中的对象,会把该对象作一个标识,反之在根部中不能触及到的对象不作标识,每一轮下来把做了标识的对象内存保留,其他的对象给释放掉