ホームページ  >  に質問  >  本文

javascript - 通常、誰もがクロージャに関数を使用しますが、オブジェクトまたはクロージャを使用した場合はどうなりますか?

リーリー

関数 test1 は、このように呼び出した後、メモリを解放しますか?
グローバル変数 a は、関数 test1 にあるオブジェクトへの参照を配置します。test1 がメモリを解放しないのはなぜだと思いますか?アドバイスをお願いします。 。 。 。

PHP中文网PHP中文网2710日前644

全員に返信(3)返信します

  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:44:53

    a と test1 は実行コンテキストを共有します。つまり、a と test1 は共存して消滅します~
    私の理解が間違っているかどうかはわかりません~例:

    リーリー

    テスト実行後、test1がリリースされ、aもリリースされると思います。
    関数内ではなくウィンドウ直下にある場合、test1は常に存在します~

    返事
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:44:53

    以前誤解していましたが、これには 2 つの問題があるはずです。

    実行後、test1の変数は直接参照されないので、test1の実行環境、つまりコンテキストを再利用する必要があります。これはクロージャではありません。さらに、test1 の関数本体自体は、それが配置されているコンテキストに属する属性です。コンテキストが存在する限り、関数本体自体はリサイクルされません。

    返事
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:44:53

    結論から話しましょうね
    まず、クロージャの定義は自由変数にアクセスできる関数であり、定義に矛盾します

    理解が間違っている場合は
    例を変更してください

    リーリー

    original obj1 が指すオブジェクトは a にも存在しますが、これはまだクロージャだと思いますか?

    あなたの例では、test1の実行後、ta、tb、obj1がすべて解放されます。
    test1の実行後、その中で作成されたobj1変数が指すオブジェクトがグローバル変数aに追加されます。このオブジェクトは a[0] によって参照されているため解放されませんが、obj1 のスコープはプロセス全体を通じて変更されていません。 obj1 の代わりに obj1 によってポイントされます。 私の中国語能力が低すぎて、うまく話せない気がします = =

    返事
    0
  • キャンセル返事