84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
関数 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 によってポイントされます。 私の中国語能力が低すぎて、うまく話せない気がします = =