0

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

但是,如果我将 console.log 放在“c”测试中,它会注销 8。

4

1 回答 1

1

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

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

于 2013-02-06T16:07:41.277 回答