以下代码执行后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 已经正确的回答了,我再详细说一下,。
你的代码可以等价于:
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 调试,一步一步看就很明白了。
@杨军军@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
再无任何关系。
如果还是不懂的话,我可以给题主画图。
时间: 2024-10-12 17:19:49