1

イベントをバインドした DOM から要素を削除するときに開発者が何をすべきかについて、ドキュメントには何も見つかりませんでした。jQuery には remove() と detach() があります。前者はバインドされたイベントを削除しますが、後者は削除しません。Element#remove() を呼び出すとき、開発者は何をすべきですか?

4

1 に答える 1

3

リスナーは、要素からリッスンしているものへの参照です。これは、要素が GC されるまで、要素がリッスンしているものを保持することを意味します。

リスニングはリスナーから要素への参照を追加しないため、リスナーの前に要素を GC できます。

GC について考える方法は参照です。オブジェクト A がオブジェクト B への参照を持っている場合、オブジェクト A はオブジェクト B を維持します。しかし、オブジェクト B がオブジェクト A への参照を持っていない限り、B は A が GC されるのを妨げません。イベントはターゲットからリスナーへの参照ですが、その逆ではありません。

さらに、オブジェクト A がオブジェクト B への参照を持ち、B が A への参照を持っている場合、両者はお互いを保持していますが、どちらにも参照がない場合は、両方を GC できます。

これが意味することは、要素をリッスンしているコードのライフサイクルが要素に近似している、または要素よりも長いと予想される場合、リッスンを解除する必要がないということです。しかし、要素の存続期間が長く、リスナーの存続期間が短いと予想される場合は、リスナーを分離する必要があります (これは理にかなっています-存続期間の短いリスナーがまだ何かを聞いているのはなぜでしょうか?)。(回答は Google エンジニアの Pete Blois の厚意によるものです)。

于 2013-11-21T22:41:52.780 に答える