为了账号安全,请及时绑定邮箱和手机立即绑定

变量作用域及栈堆储存

变量作用域及栈堆储存

当年话下 2019-02-28 11:20:57
代码:问题:这三个obj之间的关系是什么?从作用域和栈堆的角度分析?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

首先你要说明到底哪三个,这里不止三个啊,假设是这样:


function sum(obj) { // 第二个 obj

    obj.a = 3;

    var obj = new Object(); // 第三个 obj

    obj.a = 2;

    console.log(obj.a);

}

var obj = { a: 1 }; // 第一个 obj

sum(obj);

console.log(obj.a);

执行该代码,此时是全局作用域,该作用域内有sum、obj以及所有的全局对象如console。“第一个 obj”就是一个普通的变量,指向了{ a: 1 }这个对象在内存中的地址。


执行sum函数,将sum函数的作用域入栈,该作用域内有obj以及所有的全局对象如console,分析该作用域内的obj。首先“第二个 obj”是形参,可以理解为会在sum函数作用域内声明obj变量,该变量也指向了 { a: 1 }在内存中的地址;“第三个 obj”是在该作用域内声明的一个变量,等于就是重复声明了obj,将该变量指向了一个内存中新的对象{};


然后指向console.log,将该作用域入栈,执行完后出栈。sum函数执行完成,出栈。执行console.log,入栈,再出栈。


最后在回答下你的问题,这三个obj之间的关系是什么?


第一个和第二个 obj 都是指向了同一个对象,obj1 === obj2

第三个 obj 指向一个新的对象,obj1 !== obj3

如果想要更多人回答你的问题,建议你代码不要拍照,描述更加清晰些。希望对你有帮助。


查看完整回答
反对 回复 2019-03-04
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

第一个obj是sum函数的形参,第二个obj是sum函数的内部变量,第三个obj是sum函数调用时的实参。


查看完整回答
反对 回复 2019-03-04
  • 2 回答
  • 0 关注
  • 502 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信