javascript - 通常、誰もがクロージャに関数を使用しますが、オブジェクトまたはクロージャを使用した場合はどうなりますか?
PHP中文网
PHP中文网 2017-05-19 10:42:53
0
3
701
リーリー

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

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(3)
淡淡烟草味

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

リーリー

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

いいねを押す +0
滿天的星座

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

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

いいねを押す +0
淡淡烟草味

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

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

リーリー

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

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート