先从经典的 new个新对象来吧;
function setName(obj) {
obj.name = "对象";
//return obj.name = "新对象"
obj = new Object();
obj.name = "新对象";
}
var person = new Object();
setName(person);
console.log(person);
先来解析一下 函数的运行;
function setName(obj){} 我是命名了一个为 setName 的函数;它有一个 形参-变量(obj);没有确定值 类型;
然后 obj.name = "对象" 这一赋值操作 ,将 我们声明的 参数 obj 下的 叫做 name 的对象 赋值 “对象”;(语法上来说 这么做是 不允许的 直接运行 会报错 ;那么如何解决 ? 向下看)
我们 打印出来 会发现 这个 obj 里面 会有一个 叫做 name 的对象 ;他的值就是 string -- “对象”,
然后 我又 重新定义 obj ,(obj = new Object() ),然后重新赋值 其下的 name = “新对象”;
按照 执行顺序 来说 现在 obj.name = “新对象”;
声明 person 为一个 新对象( var person = new Object(); 在这里 我们 规定了 person 为一个对象 )
然后 调用了 函数 setName()
参数为 我声明的 (person)
然后打印 console.log(person)
理论上 应该是 {name: "新对象"}
但是 事实上 打印结果 为 {name: "对象"}!!!!!
为什么? 我明明 重新 new Object() 赋值 name = “新对象” 了呀!
其实 在函数setName()内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数setName()内部重写obj 时,这
个变量 obj 引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
所以 我们看到的 最终值 是 “对象” 不是 “新对象”;
哈哈哈哈 是不是 很好玩儿 ;有意思 呀;