関数 test1 は、このように呼び出した後、メモリを解放しますか? グローバル変数 a は、関数 test1 にあるオブジェクトへの参照を配置します。test1 がメモリを解放しないのはなぜだと思いますか?アドバイスをお願いします。 。 。 。
认证高级PHP讲师
a と test1 は実行コンテキストを共有します。つまり、a と test1 は共存して消滅します~私の理解が間違っているかどうかはわかりません~例:
テスト実行後、test1がリリースされ、aもリリースされると思います。 関数内ではなくウィンドウ直下にある場合、test1は常に存在します~
以前誤解していましたが、これには 2 つの問題があるはずです。
実行後、test1の変数は直接参照されないので、test1の実行環境、つまりコンテキストを再利用する必要があります。これはクロージャではありません。さらに、test1 の関数本体自体は、それが配置されているコンテキストに属する属性です。コンテキストが存在する限り、関数本体自体はリサイクルされません。
結論から話しましょうね まず、クロージャの定義は自由変数にアクセスできる関数であり、定義に矛盾します
理解が間違っている場合は例を変更してください
original obj1 が指すオブジェクトは a にも存在しますが、これはまだクロージャだと思いますか?
あなたの例では、test1の実行後、ta、tb、obj1がすべて解放されます。 test1の実行後、その中で作成されたobj1変数が指すオブジェクトがグローバル変数aに追加されます。このオブジェクトは a[0] によって参照されているため解放されませんが、obj1 のスコープはプロセス全体を通じて変更されていません。 obj1 の代わりに obj1 によってポイントされます。 私の中国語能力が低すぎて、うまく話せない気がします = =
a と test1 は実行コンテキストを共有します。つまり、a と test1 は共存して消滅します~
リーリー私の理解が間違っているかどうかはわかりません~例:
テスト実行後、test1がリリースされ、aもリリースされると思います。
関数内ではなくウィンドウ直下にある場合、test1は常に存在します~
以前誤解していましたが、これには 2 つの問題があるはずです。
実行後、test1の変数は直接参照されないので、test1の実行環境、つまりコンテキストを再利用する必要があります。これはクロージャではありません。さらに、test1 の関数本体自体は、それが配置されているコンテキストに属する属性です。コンテキストが存在する限り、関数本体自体はリサイクルされません。
結論から話しましょうね
まず、クロージャの定義は自由変数にアクセスできる関数であり、定義に矛盾します
理解が間違っている場合は
リーリー例を変更してください
original obj1 が指すオブジェクトは a にも存在しますが、これはまだクロージャだと思いますか?
あなたの例では、test1の実行後、ta、tb、obj1がすべて解放されます。
test1の実行後、その中で作成されたobj1変数が指すオブジェクトがグローバル変数aに追加されます。このオブジェクトは a[0] によって参照されているため解放されませんが、obj1 のスコープはプロセス全体を通じて変更されていません。 obj1 の代わりに obj1 によってポイントされます。 私の中国語能力が低すぎて、うまく話せない気がします = =