码迷,mamicode.com
首页 > 其他好文 > 详细

president ={name:"bush"}问题

时间:2016-04-03 00:21:07      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

 以下代码执行后president.name的值是
(function(callback){  
    president ={name:"bush"};  
    callback(president); 
})(function(obj){    
    obj.name ="obama";    
    obj ={name:"clinton"}; 
})

答案是什么?求解答。。不是太懂。谢谢。

 

答案是obama啊

president ={name:"bush"}; 这里最先执行. 执行后, window.president.name就是bush了.

但是后面又执行了callback, 对president的name进行重新赋值为obama.

再后面的对obj重新赋值, 只是使obj不再对president有引用, 而是指向了新的一个object. 不影响president

@Treri 已经正确的回答了,我再详细说一下,。

你的代码可以等价于:

jsfunction foo(obj){
  obj.name ="obama";    
  obj = {name:"clinton"}; 
}

function bar(fn){
  window.president = {name: "bush"};
  fn(president);
}
bar(foo);

具体的 president 的变化是这样的

window.president = {name: "bush"}; // president.name = "bush"
// 开始进入 foo 函数
obj.name ="obama";  // president.name => "obama",这时候 obj 和 president 指向同一个对象

obj = {name:"clinton"}; // obj.name = "clinton", president.name => "obama", obj, president 此时指向不同的对象

提示:你可以使用 chrome dev tool 调试,一步一步看就很明白了。

@杨军军@Treri以上两位大神的解释都没有错,我在他们的基础上补充点。

function foo(obj){
  obj.name ="obama";    
  obj = {name:"clinton"}; 
}

function bar(fn){
  window.president = {name: "bush"};
  fn(president);
}
bar(foo);

这里的重点是编程语言中很重要,但对新手来说也是难点的问题:函数参数是传值还是传引用
其实,最终只有一个传参方式:传值。因为,传引用本质上传的是对象对应的地址。
本题在执行foo函数时,president以参数的形式传给objobjpresident指向同一地址,代表相同对象。但obj指向的改变并不影响president,只是objpresident再无任何关系。
如果还是不懂的话,我可以给题主画图。

president ={name:"bush"}问题

标签:

原文地址:http://www.cnblogs.com/sakurashadow/p/5348537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!