3

これは変数なしで書き直すことができることを無視してください。簡単な例を示すだけです。

window.onload = function() {
    var a = document.body, b = function() {console.log(1)};
    a.onkeydown = b;
};

私は何が起こるか知っています:それはうまくいきます。しかし、どのように?

bグローバル変数の場合、インタープリターはそれへの参照を保存します。この例では、ローカル変数が破棄されたときに、インタープリターはローカル変数への参照を保存し、それを関数のコピーであると想定するものに置き換えるだけですか? それとも、ローカル変数への参照はまだ舞台裏のどこかに保存されており、その後再利用されていますか?

4

1 に答える 1

4

関数(およびその他のオブジェクト)は常に参照によって渡されます。b関数は含まれていませんが、それを指しています。を割り当てると、同じ関数オブジェクトa.onkeydown = bをポイントすることになります。a.onkeydownその後、関数が終了するため、ローカルb変数は破棄されますが、それが指す関数はまだ存在します。それを指すものが他にない場合にのみ、ガベージコレクターによって削除されます。

于 2013-01-29T04:03:30.273 に答える