函数参数的按值传递

ECMAScript 中所有函数的参数都是按值传递的

其实我一直也是比较困惑的,因为 javascript 基本类型值的传递如同基本类型变量的复制一样,而
引用类型值的传递,则如同引用类型变量的复制一样。

其实 javascript 中很大的一个问题就是,我们可以使用 对象 Object 来实现 函数参数(局部变量)修改全局变量内容

举个列子:

  • 下面的函数是无法直接修改name(外部变量)
    var name = "postbird";
    function changeName(name){
        name = "new " + name;
        return name;
    }
    console.log(name) // postbird
    console.log(changeName(name)); // new postbird

而下面的函数能够让我们 完美 的改变name,而不必靠返回值更新name值

    var person = new Object();
    person.name = "postbird";
    function changeName(obj){
        obj.name="new "+obj.name;
    }
    console.log(person.name) //postbird
    changeName(person)
    console.log (person.name); // new postbird

由于上面的例子,我一直以为,传递的时候其实传递的是引用,而不是值,所以我对 javascript 函数都是按值传递是存在疑惑的

不过下面的例子能够比较充分的说明函数参数是按值传递的:

    var person = new Object(); 
    person.name = "postbird";
    function changeName(obj){
        obj.name="new "+obj.name;
        obj = new Object();
        obj.name = "obj Name";
    }
    console.log(person.name) // new postbird
    changeName(person)
    console.log(person.name); // new postbird

上面函数相比较于第二个函数,最大的不同就是我将一个新的对象付给了 obj ,同时设置了 obj 的 name 属性

**如果参数 obj 是传递的应用,则实际上我在将新的对象传递给 obj 的时候,也就是间接的更改了 person 的引用,而我再次设置了 obj.name="obj name",这个操作不是覆盖原来的name属性,而是给新的obj增加了一个name属性,同样如果person传递的是引用,则当我在执行完函数之后,再输入person.name的时候,显示的应该是
obj Name ,然而事实却是 new postbird,证明 person.name 没有任何的变化。**

这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj 时,这

个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。
---- 来自《javascript高级程序设计》