传递参数给函数
按值传递一个参数给函数就是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组时,如果直接在函数中用新值覆盖原先的值,在函数外并不反映新值。只有在对象的属性或者数组的元素改变时,在函数外才可以看出。例如(使用 IE 对象模式):// 本代码段破坏(覆盖)其参数,所以
// 调用代码中反映不出变化。
function Clobber(param) 
{
    // 破坏参数;在调用代码中
    // 看不到。
    param = new Object();
    param.message = "This will not work";
}// 本段代码改变参数的属性,
// 在调用代码中可看到属性改变。
function Update(param)
{
    // 改变对象的属性;
    // 可从调用代码中看到改变。
    param.message = "I was changed";
}// 创建一个对象,并赋给一个属性。
var obj = new Object();
obj.message = "This is the original";// 调用 Clobber,并输出 obj.message。注意,它没有发生变化。
Clobber(obj);
window.alert(obj.message); // 仍然显示 "This is the original"。
// 调用 Update,并输出 obj.message。注意,它已经被改变了。
Update(obj);
window.alert(obj.message); // 显示 "I was changed"。
我 不明白为什么红色部分 是这个"This is the original"。
他不是应该是 "This will not work";
为什么 会这样 不是很理解!

解决方案 »

  1.   

    在Clobber函数里,一开始param是obj对象的引用,在执行 param = new Object(); 后,param就指向这个新对象了,和之前的obj对象就没关系了你改变的只是这个新对象的属性.
      

  2.   

    因为你调用Clobber(obj)的时候,新建了一个obj对象,你改变的相当于局部变量,你在Clobber(obj)函数里面加一句window.alert(obj.message);会发现输出的是"This will not work"; 你改变的是内部对象的值.对外面的全局变量obj没有影响
    Clobber(obj); window.alert(obj.message); 执行的时候,这个obj是全局变量.不一样的.