来看看这个js问题,以下代码执行后president.name的值是



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

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

JavaScript

蛋疼的菊花 8 years, 11 months ago

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


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

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

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

2P腋巫女 answered 8 years, 11 months ago

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

你的代码可以等价于:


 js


 function 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 调试,一步一步看就很明白了。

haoshou answered 8 years, 11 months ago

答案是obama啊

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

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

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

潛水艦U511 answered 8 years, 11 months ago

Your Answer