素材牛VIP会员
变量作用域及栈堆储存
 Am***ze  分类:JavaScript  人气:765  回帖:2  发布于6年前 收藏

代码:

问题:这三个obj之间的关系是什么?从作用域和栈堆的角度分析?

 标签:javascript

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv7 码师
亡***师 JS工程师 6年前#1

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

Lv6 码匠
赵***2 Web前端工程师 6年前#2

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

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);

执行该代码,此时是全局作用域,该作用域内有sumobj以及所有的全局对象如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
如果想要更多人回答你的问题,建议你代码不要拍照,描述更加清晰些。希望对你有帮助。
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取