0

John Resigのを調べながら、Qunitを使用して彼のアサーションの例を書き直したいと思いました。#55に到達するまで、すべてがうまくいきました。Johnsの例では、テスト「c」(7行目)は「undefined」に等しくなければなりません。私の例のQunitによれば、「c」は8に等しくなければなりません。「c」テストをconsole.logsで囲みましたが、どちらも未定義を生成します。これがjsbinです。誰かが何が起こっているのか説明できますか?わからない...

jsbinにアクセスできない場合に備えて、次のコードを使用します。

var a = 5; 
function runMe(a){
    'use strict';
    test('a', function(){
        strictEqual(a, 6, 'Check the value of a.');
    });

    function innerRun(){
        test('b', function(){
            strictEqual(b, 7, 'Check the value of b.');
        });
        console.log(c);
        test('c', function(){
            //the problem seems to be here
            strictEqual(c, 8, 'Check the value of c.');
        });
        console.log(c);
    }

    var b = 7;
    innerRun();
    var c = 8;
} 
runMe(6); 

for ( var d = 0; d < 3; d++ ) {
    setTimeout(function(){ 
        test('d', function(){
            strictEqual(d, 3, 'Check the value of d.');
        });
    }, 100); 
}

ただし、「c」テスト内からconsole.logを配置すると、ログアウトします8。

4

1 に答える 1

1

すべてのvarステートメントは、ブロックの先頭で一緒に移動されます(巻き上げ)。巻き上げは、なぜc定義されているのかを説明しています。実際に値を持つ理由8は、後で実行されるQUnitのテスト関数を定義するためです。

関数の定義と実行の間の短い時間枠で割り当てvar c = 8が行われ、結果が説明されます。しかし、John Resigはassert()、すぐに実行されるを使用しています。

于 2013-02-06T16:07:41.277 に答える