二:JS中的堆栈内存与函数的创建和执行

首先说明一下下文中所用到的各种词语:
ECStack(Execution [ˌeksɪˈkjuːʃn] Context Stack和EC(Execution Context )执行环境栈
GO(Global Object)全局对象
VO(Varibale Object)全局变量对象
AO(Activation Object)私有变量对象

浏览器想要执行代码,需要提供一个供代码执行的环境:
ECStack(Execution Context Stack) 执行环境栈 =>也就是栈内存(全局上下文) 在这里有一个全局对象(GO) 浏览器把所有提供JS使用的属性和方法(内置,如setInterval JSON )都放在GO中 并且在全局用一个变量window指向他
js中的创建变量与赋值:
①如果创建的变量是一个值类型->直接存在当前上下文中(也就是说没有单独分配内存存储)
②如果创建的变量是一个引用数据类型->先开辟一个堆内存,然后创建的变量引用该堆内存的地址

let a = 10 ; //没有开辟新内存 直接将值赋值给a
let a = {name:'xxx'} // 分配了一个新的堆内存 赋值给a的是一个堆内存地址

函数的创建与执行:
1.创建一个函数:
①开辟一个堆内存
②声明当前函数的作用域(在哪个上下文中创建的,它的作用域就是谁)
③把函数体中的代码当做“字符串”存储在堆内存中(创建一个函数,存储的是一堆字符串,所以函数只要不执行,函数其实没啥意义)
④把函数堆的地址放置在栈中供变量调用(函数名)
2.函数执行:
①会形成一个全新的私有上下文 EC(xx)(目的是供函数体中的代码执行),然后上下文会进栈执行
②在私有上下文中有一个存放私有变量的变量对象 AO(xx) 全局上下文中的变量对象叫VO(G)
③在代码执行之前要做的事情很多:
初始化它的作用域链 <自己上的上下文,函数的作用域>
初始化THIS (箭头函数没有THIS)
初始化ARGUMENTS实参集合(箭头函数没有ARGUMENTS)
形参赋值(形参变量是函数的私有变量,需要存储在AO中的)
变量提升(在私有上下文中声明的变量都是私有变量)
④代码执行:
把之前在函数堆中存储的字符串,拿过来在上下文中依次执行
作用域链查找机制:在代码执行中,遇到一个变量,我们首先看一下是否为自己的私有变量,如果是自己的私有变量,接下来所有操作都是操作私有的(和外界没有直接的联系);如果不是自己私有的,则按照scope-chain,向上级上下文中查找(如果是上级私有的,接下来的操作都是操作上级上下文中的变量)....一直找,直到找到EC(G)为止
⑤根据实际的情况确定当前上下文是否出栈释放:
为了保证栈内存的大小(内存优化),一般情况下,如果当前函数执行产生的上下文,在进栈且代码执行完成后,会把次上下文移除栈(上下文释放到了:之前在上下文中存储的私有的变量等信息也就有跟着释放了) =>全局上下文是在打开页面生成的,也需要在关闭页面的时候释放掉(只有页面关闭才会被释放掉)
特殊情况:只要当前上下文中的某些内容,被上下文以外的东西占用,那么当前上下文是不能被释放的(上下文中存储的变量等信息也保留下来了)

注意!函数第二次执行,会形成一个全新的私有上下文,把之前做过的事情,还是原封不动的再执行一次(所有的东西都是从头来一遍的),此时形成的上下文和上一次形成的上下文之间没有必然的联系

一般情况下,函数执行完,所形成的上下文会被出栈释放掉
特殊情况:当前上下文中某些内容被上下文以外的事物占用了,此时不能
出栈释放
全局上下文:加载页面创建的,也只是有页面关闭才会被释放掉

浏览器的垃圾回收机制:
1.引用计数(以IE为主):在某些情况下会导致计数混乱,这样会造成内存不能被释放(内存泄漏)
2.检测引用(占用)(以谷歌为主):浏览器在空闲时候会依次检测所有的堆内存,把没有被任何事物占用的内存释放掉,以此来优化内存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容