3

这些是 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 时,它是一个本地对象,如果 i

var foo = createPerson(bla,18,student); 

然后 foo 是对本地对象的引用,该对象必须在 then 之前死掉。请澄清“在函数中返回本地对象”的概念

抱歉,帖子太长了,如果需要,请编辑和压缩。

4

1 回答 1

1

当第一行setName运行时,obj引用指向person在函数外部创建的对象 - 该对象的名称设置为Nicholas. 所以在这个阶段 是在函数之外创建obj的引用的副本。person

当第二行setName运行时,本地obj引用被重新分配以指向一个新对象,因此在obj.name第三行调用时,这个新对象的名称已更改为Greg. 该person对象不受此名称更改的影响。

在工厂函数中,说“函数完成后本地对象就被销毁”是不正确的——对象的本地引用被销毁,但对象本身是在堆上创建的并且仍然存在。如果工厂函数没有return o在最后一行,那么这个对象将被垃圾回收,因为一旦函数返回就不会存在对它的引用,但是o不会被垃圾回收,因为函数返回了对它的引用。

于 2012-09-04T10:10:47.520 回答