Qunit给出了奇怪的结果

时间:2013-02-05 01:19:28

标签: javascript unit-testing qunit

在浏览John Resig的examples时,我想用Qunit重写他的断言示例。一切顺利,直到我到达# 55。在Johns示例中通过测试“c”(第7行)必须等于“undefined”,现在根据Qunit在我的例子中“c”必须等于 8 。我用console.logs包围了“c”测试,两者都产生了undefined。这是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。

1 个答案:

答案 0 :(得分:1)

所有var语句在块的开头一起移动(提升)。吊装解释了为什么定义c。它实际上具有值8的原因是,您为QUnit定义了一个测试函数,该函数稍后执行。

在函数定义和执行之间的小时间范围内,发生了赋值var c = 8,从而解释了结果。但John Resig正在使用assert(),它会立即执行。