函数的底层运行机制


一、JS中的堆(Heap)栈(Stack)内存

都是在计算机内存中开辟的空间

栈内存 Stack:ECStack(Execution [ˌeksɪˈkjuːʃn] Context Stack)
	存储原始值类型值
	代码执行的环境
堆内存 Heap:
	存储对象类型值

EC(Execution [ˌeksɪˈkjuːʃn] Context )执行上下文:区分代码执行的环境

常见上下文分类:
	全局上下文 EC(G)
	函数私有上下文 EC(?)
	块级私有上下文 EC(BLOCK)
	产生私有上下文 -> 进栈执行 -> 出栈释放(可能释放)
	变量对象:当前上下文中,用来存储声明的变量的地方
	VO(Varibale Object):VO(G) 或者 VO(BLOCK)
	AO(Active Object):AO(?)
	GO(Global Object)全局对象

window 指向 GO 对象
全局上下文中,基于var/function声明的变量是直接存储到GO对象上的;而基于let/const声明的变量才是存放在VO(G)中的;

基于let和const声明的变量不一样,到底哪里不一样呢?

GO:全局对象「堆内存中分配的一块空间 0x000」,存储浏览器的内置API
x -> 12
z -> 14

EC(G)全局执行上下文
VO(G)全局变量对象:存储全局上下文中声明的变量的{排除基于var/function声明的}
window —> 0x000
y -> 13

debugger;
var x = 12;
let y = 13;
z = 14; //window.z=14;
console.log(x, y, z); //12,13,14
console.log(window.x, window.y, window.z); //12 undefined 14 

浏览器调试分析:
在这里插入图片描述
例:

let x = [12, 23];
const fn = function fn(y) {
   
    y[0] = 100;
    y = [100];
    y[1] = 200;
    console.log(y);
};
fn(x);
console.log(x);

知识点1、函数的 运行机制
@1、创建函数
i: 在堆内存中分配一块空间,有一个16进制的内存
ii:把函数中内容存储到空间中
声明函数的作用域【在哪个上下文中创建的,他的作用域就是谁】
+ 把函数中的代码,当做字符串存储起来”代码字符串“
+ 作为对象,存储它的键值对
iii: 把空间地址放在栈中,供变量引用

@2、函数执行
i:形成一个全新的私有上下文(EC?),然后进栈执行,在私有上下文,有一个AO?私有变量对象用来存储当前上下文中声明的变量
ii:在函数代码执行之前要做好多事
+初始化作用域链<自己的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值