4

以下のコードでは:

(function (){
    function test(){};//"function"
    var test;//"undefined"
    var printTest = typeof test;
    document.write(printTest);
})();

printTestは、「undefined」ではなく「function」を表示します。これは、私の理解では、変数宣言は常に実行コンテキスト(この場合は関数実行コンテキスト)の先頭に「持ち上げられる」ためです。これにより、関数宣言が作成されます。 「test()」は、現在の実行コンテキストの後半に表示されるものです。ここで、実際にvar宣言 "var test=1"に値を割り当てるこのコードについて考えてみます。

(function (){
        function test(){};
        var test=1;//assign value to a variable here
        var printTest = typeof test;
        document.write(printTest);
    })();

次に、printTestは「番号」を表示します。これは、実行コンテキストが異なる順序を維持することを意味します。誰かがここで実際に何が起こったのか説明できますか?

4

2 に答える 2

2

var test「テストと呼ばれるものはすべてローカルでスコープする必要がある」という意味のみです。値を割り当てていないという理由だけで未定義になります(ただし、function test(){};取得する理由と取得functionしない理由はありますundefined)。

2番目の例ではfunction test(){};、関数を割り当てますが、それを。var test=1;で上書きします1。を割り当てたtypeof に使用する1ため、番号であると報告されます。

于 2011-06-11T22:20:45.763 に答える
2

巻き上げは、実際の割り当てを変数宣言から分離します。それが実際に行っているのはこれです:

(function (){
        var test, printTest;
        test = function (){};
        test = 1;//assign value to a variable here
        printTest = typeof test;
        document.write(printTest);
    })();
于 2011-06-11T22:21:01.627 に答える