3
console.log(a());
function a(){
    console.log("hello");
}

上記のコードから、私は"hello"(そしていくつかundefinedの)コンソールにログオンすることを期待します。しかし、firebugは

ReferenceError: a is not defined

それで、firebugは巻き上げをしませんか?

4

1 に答える 1

7

問題の理由は

子ブロック内で宣言された場合、関数は巻き上げられません。

MDNによる(ここでカバーされているのは標準のECMAScriptではありません)。

次のスニペットを比較します。

alert(c());
function c(){return 42;}

{
    alert(c());
    function c(){return 42;}
}

最初のものは42に警告し、2番目のものはスローしReferenceErrorます。

そして、Firebugで遊んでいるときに実行されるコードは次のとおりです。 Firebugのツールチップ

data;
with(_FirebugCommandLine){ // >> block begins
    console.log(a());
    function a(){
        console.log("hello");
    }
} // << block ends

更新
観察された動作は、ChromeおよびIE9では観察されないため、Firefoxjavascriptエンジンではグリッチのようです。このフィドルを参照してください。

于 2012-07-27T18:47:28.630 に答える