堆栈内存及闭包

堆栈内存及闭包

JS中的堆栈

let a = 0;
let b = a;
b++;
aleart(a) // "0"

let o = {};
o.a = 0;
let b = o;
b.a = 10;
aleart(o.a) // "10"

aleart()输出的结果都是字符串,toString()
JS中的数据类型:

  1. 基本类型(值类型):number string boolean null undefined
  2. 引用类型:object function
  3. 特殊类型:symbol
  4. 在这里插入图片描述
  • 栈内存:提供代码运行的环境,存储基本类型
    全局作用域 =》执行上下文栈
    等号赋值:1. 创建变量 2. 创建值 3.关联
    变量和值的关联是指针指向
    栈内存 存a和b这两个变量和0这个值,ab都指向0这个值。b=b+1,b=1,此时b关联1,不再和0关联,但是a还和0关联,所以a=0;

  • 堆内存:提供引用类型存储的空间
    堆中存a: 0,o和b都指向堆内存中变量a的地址(16进制),a改变,b.a = 10,堆内存中的a变为10,因此o.a=10

let a = {
		n: 1,
	}
let b = a;
a.x = a = {
	n: 2,
}
console.log(a.x);  // undefined
console.log(b);  // { n: 1, x: { n: 2 } } 

a.x = a =,按顺序 先a.x = {…},再a={…}
在这里插入图片描述

  1. GO:全局对象
  2. EC(G):全局执行上下文,压入ECstac(进栈),执行全局代码
  3. ECstac:执行上下文栈 =》栈内存
  4. EC:执行环境(执行上下文)
    • AO:活动对象(函数的叫做AO,相当于VO的分支)
    • VO:变量对象
  5. scope:作用域,⚠️所有的在当前的执行上下文当中,只要创建了函数,必然会给函数增加[scope]属性 =》 所以函数作用域是在函数创建的时候形成的
  6. scope Chain:作用域链
    函数每次执行的时候都会创建一个全新的执行上下文
let x = 1;
function A(y) {
	let x = 2;
	function B(z){
		console.log(x + y + z);
	}
	return B;
}
let C = A(2);
C(3);

在这里插入图片描述

eg:

let a = 12, b = 12;
function fn(){
	let a =b =13;
	// let a = 13; 这个a是私有的
	// b = 13; 这个b不是私有的,是上级作用域的b,因此上级作用域的b由12变成13
	console.log(a, b);
}
fn();
console.log(a, b); 
// 答案: 13 13 12 13

eg:
在这里插入图片描述
在这里插入图片描述

当前作用域的操作可能会把上级作用域中的变量改变拿来使用,此时上级作用域的变量被占用,此上下文不能被销毁,就形成了闭包。形成不能被销毁的执行上下文=》闭包

老师的一句话说的很好:学东西,要知其然而知其所以然!!!

b站课程笔记,视频链接:https://www.bilibili.com/video/BV1oz411t78i?from=search&seid=10784965498570581667

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值