13

私はこのフォームを知っています:

var foo = function bar() {};

barは、名前を囲んでいるスコープにリークし、に 2 つの関数を作成しjscriptます。

どうですか:

var foo = function foo() {};

?

それはまだ名前を囲んでいるスコープにリークしますが、とにかくそこにあります(thx to var foo)。

スコープ全体で定義されることはわかっていますが、2 つの関数を作成し、そのうちの 1 つをすぐに逆参照/破棄しますか、それともまだリークを引き起こしていますか?

この状況では:

var bar = function() {
    foo();
    var foo = function foo() {};
}

内部に 2 つの関数オブジェクトがありbar()ますか?

編集

OK、間違いなく 2 つの関数オブジェクトが作成されます。問題は、名前付き定義によって作成された関数が、var foo行の後で GC によって逆参照およびクリーンアップされるかどうかです。そのため、上記のコードでは常に「ライブ」fooインスタンスが 1 つしか存在しません。 ?

fooそれとも、定義によって作成されたものを「逆参照」する方法がなく、そもそもそこにあるべきではないため、IEであるIEは永遠にぶら下がったままになりますか?

4

1 に答える 1