president ={name:"bush"}问题

Posted sakura丶shadow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了president ={name:"bush"}问题相关的知识,希望对你有一定的参考价值。

 以下代码执行后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"}问题的主要内容,如果未能解决你的问题,请参考以下文章

Vol.4 |The EconomistThe Trump presidency

CFIUS and FDI Under President Trump—Part 1

Meet Microsoft’s Corporate Vice President at Tsinghua

Discover AI with the president of Google Greater China

Codeforces 1179 D - Fedor Runs for President

CF567E President and Roads