函数的变量中传递的是对象

function setName(obj) {
   obj.name = 'Nicholas';
}
let person = {};
setName(person);
 console.log(person.name);

  我们创建了一个对象并把他保存在变量person中。然后,这个对象被传给setName()方法,并被复制到参数
obj中。在函数内部,obj和person都指向同一个对象。结果就是,即使对象是按值传进函数,obj也会通过引用访问
对象。当函数内部给obj设置了name属性时,函数外部的对象也会反映这个变化,因为obj指向的对象保存在全局作用
域的堆内存上。很多开发者=错误的认为,挡在局部作用域中修改对象而变化反映到全局时,就意味着参数是按引用传
递的。

 在创建一个函数的时候,在函数体内定义变量名为‘Nicholas’并赋值给参数obj.name。
  再重新定义一个新的对象,person
  把新对象person作为参数传递进setName函数体。并进行调用。
function setName(obj) {
  obj.name = "Nicholas";
  obj = new Object();
  obj.name = "police";
}
let person = {};
setName(person);
console.log(person.name);
/* 这个例子前后唯一变化的就是setName()中多了两行代码,将obj重新定义为一个有着不同name的新对象。当
person传入setName()时,其name属性被设置为"Nicholas".然后变量obj被设置为一个新对象且name属性设置
为"police".如果person是按引用传递的,那么person应该自动将指针改为指向name为""police"的对象。可是,
当我们再次访问person.name时,它的值是“Nicholas”,这表明函数中参数的值改变之后,原始的引用仍然没有改
变。当obj在函数内部被重写时,它变成了一个指向本地对象的指针。而那个本地对象在函数执行结束时就被销毁了。
 */
**// 注意:ECMAScript中函数的参数就是局部变量。**
上一篇:2021-10-23


下一篇:java_多线程 (二)