问题描述
- 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内存中的对象本身,传递的是该对象的引用,那么,这能理解为按值传递么?
解决方案
简单来说,就是你修改函数里面的参数,不会影响调用者中的那个变量。注意这个修改对于对象来说是指向新的 变量,不是修改对象的属性。
解决方案二:
“=",是对 对象进行赋值,之后就表示新赋值的对象(or值),和传入的不是同一个东西。后续引用的也是后赋值的对象
这个实际和java类似,也是简单的数据对象就可以完全看成值传递,复杂的数据对象就是引用,在局部函数中操作传入对象的属性,都是引用传递;
如果对传入对象本身赋值,则属于局部对象赋值,这个时候和传入的参数已经没有关系了。
时间: 2024-10-20 07:31:54