《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内存中的对象本身,传递的是该对象的引用,那么,这能理解为按值传递么?