2013-03-07 3 views
5

javascriptのブロック/機能は、一度ロードされると常に利用可能です。私は何かをテストしたので、今私は少し混乱しています。私はdivにスクリプトブロックを定義しました。スクリプトブロックには、要素がajaxでdivをリロードするためのイベント処理関数があります。 ajax呼び出しはdivのプレーンhtmlを返し、現在のものに置き換えます。しかし、それは実行をも行うスクリプトを置き換えることを意味します。私は、スクリプトを置き換えた後に実行が中断されてしまったことを知った。しかし、それはしませんでした。 replaceステートメントが実行された後のコード行これがどのように機能するか。スクリプトブロックのライフタイムをどのように記述しますか?スクリプトブロックまたはjavascriptコードの生涯を知るには?

答えて

8

script要素に含まれるコードが評価されると、そのコード評価の結果はページの実行時環境の一部になります。 script要素を削除しても、結果の構造体(関数など)は環境から削除されません。

スクリプトが関数を定義したり、イベントハンドラを要素にフックしたり、既存のオブジェクト(グローバルオブジェクトを含む)に新しいプロパティを作成した場合、それらの関数、ハンドラ、およびプロパティは、それらを定義したscript DOMから削除されます(通常のJavaScriptのガベージコレクションの対象となります;例えばどこでも参照されていないオブジェクトはGCに適格ですが、script要素はそれに関係しません)。 script要素は、コードをブラウザに伝えるための単なるメカニズムです。

+0

ありがとうございました。私はもう一つの要塞を持っています。 divをリロードした後、まったく同じ機能を持つ同じスクリプトブロックがロードされています。それで、それらは公表されたか、置き換えられたか、または無視されましたか? –

+1

@HalilIbrahim:コードが再び実行されます。グローバルスコープで宣言された関数がある場合、既にそこにある関数が新しいスコープで置き換えられます。グローバル変数が*イニシャライザなしで宣言されている場合(つまり、 'var foo;'ではなく 'var foo = 42;')、変数が既に宣言されているので、2番目の宣言は無視されます。初期化子や代入( 'var foo = 42;'または 'foo = 42;')がある場合、それらは再び実行されるので 'foo'は' 42'に設定されます。コードを2番目(3番目、4番目)の時間実行するすべての影響が発生します。 –

+0

@Crowder:答えに感謝します。 –

関連する問題