变量和对象在内存中如何存储?

两个面试题:

var a = 10;
function a(){
console.log(a);
};
a();
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); 
console.log(b.x); 
console.log(a); 
console.log(b); 

答案:
这里写图片描述

这里写图片描述

做对了吗?
下面分别分析这两个面试题:
1.javascript是单线程的,自上而下有序执行
2.javascript执行代码前,将变量,函数,参数提取出来,进行预加载处理(函数声明优先于变量声明。)

//预加载:
var a;
var a = function(){
console.log(a);
};
//执行
//a = 10;
//a();

第一题:
考虑:a函数永远不被调用?
答案是:如果先调用的话,是可以调用的.因为在预加载时,函数声明优先级高,a此时存储着a函数的地址,指向a函数.(number和地址,我们选择地址)
但是为什么在这个面试题中无法调用,a is not a function.
原因是:变量赋值时,a变量存储number10,已经不再指向函数,并且这个函数被销毁.

图解:
这里写图片描述

var a;
var b;
a = {n: 1};
b = a;
a.x = a = {n: 2};
console.log(a.x); 
console.log(b.x); 
console.log(a); 
console.log(b); 

第二题:
考虑:连等的情况是指向同一个地址内存.
a.x 与 a 都指向{n: 2}对象的内存地址.
所以输出b.x可以输出{n:2},本质上是x属性存储的是object2的地址.(见下图)

图解:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值