帮我解释下这段代码吧,谢谢了

我有时不是我 2013-08-29 03:07:30
<script type="text/javascript">
function setName(obj) {
obj.name = "xiaobai";
obj = new Object();
obj.name = "xiaohei";
}
var dog = new Object();
setName(dog);
alert(dog.name);
/*输出
*xiaobai
*/
</script>


我想不通为什么输出的是“xiaobai”,应该是“xiaohei”吧。
...全文
142 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿鱼 2013-08-29
  • 打赏
  • 举报
回复
楼主这个例子可以用来阐释“js中参数是按值传递而不是引用传递”。 具体到你的代码: setName(dog)的具体执行步骤是: 0 函数开始: 1 (setName(dog))=>复制变量dog的指针给obj,使得obj和dog共同指向(引用)同一个对象(即你创建的那个空对象)。 2 (obj.name = "xiaobai";)=>给obj和dog共同引用的空对象添加值为“xiaobai”的name属性。 3 (obj = new Object();)=>切断obj和原对象之间的联系,让obj引用一个新的空对象。这里要注意的是:虽然obj不再引用原对象,但是dog和原对象之间的联系并未切断,因此dog仍然保持者对原对象的引用,只不过此时的原对象具有了一个值为“xiaobai”的name属性。 4 (obj.name = "xiaohei";)=>因为obj现在引用的是一个新的空对象,所以这一步是给新对象添加name属性,属性值“xiaohei” 5 函数执行完毕。 所以在函数执行完后,dog引用的依然是原来的对象,自然会弹出“xiaobai”。 所谓“按引用传递”本质上是:给参数传值得变量和参数是相互独立的。(个人理解 仅供参考)
  • 打赏
  • 举报
回复
function setName(obj) { // obj变量 指向 dog obj.name = "xiaobai"; //给obj属性赋值 obj = new Object(); //obj指向新对象 obj.name = "xiaohei"; //给obj属性赋值 }
我的波塞冬 2013-08-29
  • 打赏
  • 举报
回复
对象变换了。
KK3K2005 2013-08-29
  • 打赏
  • 举报
回复
引用 楼主 u010052814 的回复:
<script type="text/javascript"> var dog = new Object(); //这里你声明了一个 dog 并且创建了一个对象给他 function setName(obj) { //这里传入的变量(参考下文) obj是一个新的变量 同时 指向 上面dog指向的对象 obj.name = "xiaobai"; //所以这里的修改成立 因为 obj 和 dog 指向同一个对象 obj = new Object(); //这里你又创建了一个对象并且 赋给了 obj 这个时候 obj和dog 指向不同的对象 obj.name = "xiaohei"; //这里的修改 只是影响了 obj指向的对象 没有影响 dog指向的对象 } setName(dog); alert(dog.name); /*输出 *xiaobai */ </script> 我想不通为什么输出的是“xiaobai”,应该是“xiaohei”吧。
看注释 记住在面向对象的时候 变量 和 实际对象 是2个东西 var a = new Object; //创建了一个 变量a 和一个 对象object 同时a指向了object a.name = 'xxx'; //这个时候 .运算符 是对 a指向的 object的操作 a = new Object(); //这个时候是对 a变量本身的操作 a指向了你又创建的一个新对象 这个时候有 2个object 但是a指向第2个
灰蛋一个 2013-08-29
  • 打赏
  • 举报
回复
对象不同了
我有时不是我 2013-08-29
  • 打赏
  • 举报
回复
谢谢了,还有更好的解释吗
似梦飞花 2013-08-29
  • 打赏
  • 举报
回复
function setName(obj) { obj.name = "xiaobai"; var x=obj; obj = new Object(); obj.name = "xiaohei"; alert(x===obj); } var dog = new Object(); setName(dog); alert(dog.name); 可能是因为第一次的时候obj是指向dog的对象 而重新new Object后obj不再指向dog 所以修改也不是修改dog对象 所以输出xiaobai

87,903

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧