Javascript函数内部覆盖形参对象

Category:
发表:

有一个js的函数,其参数是一个object型的数据,如果在函数内部使用另外一个对象将其覆盖,会发生什么事情呢?

现在有一个Javascript函数,如下:

var setName = function(arg) {
    arg.name = 'Wangcai';
    arg = new Object();
    arg.name = '9527';
};

var dog = new Object();
setName(dog);
console.log(dog.name);

结果:

Wangcai

这是为什么呢?

因为在函数setName中,将dog作为实参传入,在函数内部修改dogname属性,此时dog的值为{name: "WangCai"},紧接着,又new了一个新的对象覆盖了形参arg,并且随后改写了arg.name

其实此时的arg与一开始传入的形参arg已经不是同一个对象了,前者为传入的形参,后者为函数内容的局部变量。

引用《Javascript高级程序设计》书中的一句话:

当在函数内部重写引用对象arg时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即销毁。