这些是Nicholas Zakas的书摘录,我不清楚,请帮助我理解。
function setName(obj) {
obj.name = “Nicholas”;
obj = new Object();
obj.name = “Greg”;
}
var person = new Object();
setName(person);
alert(person.name); //”Nicholas”
函数退出后,本地对象obj在堆中死了(当它返回obj时也一样吗?)
person和obj是堆中的单个对象的副本或引用吗?
他说“当obj被覆盖在函数内部时,它就变成了一个指针 到一个本地对象。一旦函数执行“。
,该本地对象就会被销毁然后,他解释了工厂模式如下:
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
因为现在o是本地对象,他说“一旦函数完成执行就会破坏本地对象”。所以当函数返回o是一个本地对象,如果我
var foo = createPerson(bla,18,student);
然后foo是对本地对象的引用,到那时它必须是死的。请澄清“在函数中返回本地对象”的概念
很抱歉这篇文章很长,如果需要,请编辑和缩小。
答案 0 :(得分:1)
当setName
的第一行运行obj
引用指向在函数外部创建的person
对象时 - 此对象的名称设置为Nicholas
。因此,在此阶段obj
是在函数外部创建的引用person
的副本。
当setName
的第二行运行时,将重新分配本地obj
引用以指向新对象,因此当在第三行上调用obj.name
时,它就是这个新对象其名称已更改为Greg
。 person
对象不受此名称更改的影响。
在工厂函数中,说“一旦函数完成就会破坏本地对象”是不正确的 - 对象的本地引用被破坏,但对象本身是在堆上创建但仍然存在。如果工厂函数在最后一行没有return o
,那么这个对象将被垃圾收集,因为一旦函数返回就不存在对它的引用,但是o
不是垃圾收集因为对它的引用由函数返回。