JS里,如何理解函数的传参都是按值传递的?

《JavaScript高级程序设计》里讲到函数按值传递时,特意提了“在局部作用域中修改的对象会在全局作用域中反映出来,说明参数是按引用传递的”这个说法是错误的,随即Nicholas也给出了一个例子:

 function setName(obj){
     obj.name = 'Nicholas';
     obj = new Object();
     obj.name = 'Greg';
 }

 var person = new Object();
 setName(person);
 alert(person.name);    //returns 'Nicholas'

Nicholas本人也说了,“实际上,当在函数内部重写obj时,这个变量引用的就是局部变量了,而这个局部变量会在函数执行完毕后立即被销毁”,那么:
1、经过重写的obj,可否理解为已经不是person对象?或者说,obj这个函数的局部变量装的东西已经换了,不再是实参person传来的对象引用,而是一个函数内部的、一个新的匿名对象的引用?若如此,那么“在局部作用域中修改的对象会在全局作用域中反映出来,说明参数是按引用传递的”这种说法就应该是正确的啊,因为的确是按引用传递的,Nicholas举的例子本质上并没有证明这个说法是错误的。
2、ECMAScript规定参数都是按值传递的,那么传递一个对象时,难道传递的方式不是按引用传递?可以肯定的是,传递的不是存储在stack内存中的对象本身,传递的是该对象的引用,那么,这能理解为按值传递么?

2个回答

简单来说,就是你修改函数里面的参数,不会影响调用者中的那个变量。注意这个修改对于对象来说是指向新的 变量,不是修改对象的属性。

“=",是对 对象进行赋值,之后就表示新赋值的对象(or值),和传入的不是同一个东西。后续引用的也是后赋值的对象
这个实际和java类似,也是简单的数据对象就可以完全看成值传递,复杂的数据对象就是引用,在局部函数中操作传入对象的属性,都是引用传递;
如果对传入对象本身赋值,则属于局部对象赋值,这个时候和传入的参数已经没有关系了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐