3

これらはニコラス・ザカスの本からの抜粋ですが、はっきりしていません。理解するのを手伝ってください。

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はローカルオブジェクトへの参照であり、それまでに停止している必要があります。「関数でローカルオブジェクトを返す」の概念を明確にしてください

長い投稿で申し訳ありませんが、modは必要に応じて編集して要約してください。

4

1 に答える 1

1

setName実行の最初の行で、obj参照は関数の外部で作成されたオブジェクトを指します。personこのオブジェクトの名前はに設定されていNicholasます。したがって、この段階 では、関数の外部で作成されobjた参照のコピーがあります。person

2行目のsetName実行時に、ローカルobj参照が再割り当てされて新しいオブジェクトを指すようになります。したがってobj.name、3行目でが呼び出されると、名前がに変更されたのはこの新しいオブジェクトGregです。オブジェクトは、このperson名前の変更による影響を受けません。

ファクトリ関数では、「関数が終了するとすぐにローカルオブジェクトが破棄される」と言うのは正しくありません。オブジェクトへのローカル参照は破棄されますが、オブジェクト自体はヒープ上に作成され、まだ存在しています。ファクトリ関数がreturn o最後の行にない場合、関数が返されるとオブジェクトへの参照が存在しないため、このオブジェクトはガベージコレクションされますがo、関数によって参照が返されるため、ガベージコレクションは行われません。

于 2012-09-04T10:10:47.520 に答える