displayX
@displayX (あーる)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScriptのローカルオブジェクトは静的変数扱い?

解決したいこと

C言語では、ローカル変数のアドレスを返すとWarningで怒られます。
たしかに、関数が終わったら消える変数のアドレスを返すとマズイですよね?

しかし、関数型言語では、ローカルで作ったオブジェクトなどを普通に返せます。(JSならオブジェクトは参照の値渡しだったと思いますが)

つまり、関数型言語のローカルで作られたオブジェクトは、
静的変数なんですか?

GCが働くまで、メモリを消費し続けるということですかね?

0

2Answer

つまりはこういう事ですよね?

function someFunction(){
  const x = {a: 1}

  return x
}

const object = someFunction()

console.log("object.a:", object.a)

const objectは参照がなくなるまでは居続けますし、GCが発生するタイミングでメモリから消えるはずです。

0Like

Comments

  1. @displayX

    Questioner

    ありがとうございます。
    パフォーマンスにも影響がありますかね?
    関数内でのオブジェクト生成が気になります。
    外で作って渡すようにします。
  2. よっぽどメモリの使用に制約がある場合以外、すでにブラウザを立ち上げてる時点で相当なメモリを食うので、巨大なツリー構造のオブジェクトをdeepcopyして回るようなことじゃなければ、特にオブジェクトのメモリは気にする必要がないとは思います。

    外で作ろうが関数内で作ろうが同じメモリ量なんで、循環参照などでメモリリークするようなことを避けるほうが重要な気がします。
  3. @displayX

    Questioner

    なるほど。
    ありがとうございます。

GC による インスタンスの解放を観測したいのでしたら、 弱参照系のクラス群にある
WeakRef で観測してみてはいかがでしょうか?

(() => {
    const ref = (() => {
        const v = {[Symbol.toStringTag]: "v"};
        return new WeakRef(v);
    })();
    setTimeout(act,1000);
    function act() {
        const d = ref.deref();
        const time = new Date();
        console.log(`${time}: ${d}`);
        if (d) setTimeout(act, 1000);
    }
})();
0Like

Your answer might help someone💌