Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 昆特给出了一个奇怪的结果_Javascript_Unit Testing_Qunit - Fatal编程技术网

Javascript 昆特给出了一个奇怪的结果

Javascript 昆特给出了一个奇怪的结果,javascript,unit-testing,qunit,Javascript,Unit Testing,Qunit,在浏览John Resig的文章时,我想用Qunit重写他的断言示例。在我到达之前一切都很顺利。在约翰的例子中,要通过测试,“c”(第7行)必须等于“未定义”,现在根据我例子中的Qunit,“c”必须等于8。我用console.log包围了“c”测试,这两个测试都会产生未定义的结果。给你。有人能解释一下发生了什么事吗?我不明白 为了防止无法访问jsbin,我的代码如下: var a = 5; function runMe(a){ 'use strict'; test('a',

在浏览John Resig的文章时,我想用Qunit重写他的断言示例。在我到达之前一切都很顺利。在约翰的例子中,要通过测试,“c”(第7行)必须等于“未定义”,现在根据我例子中的Qunit,“c”必须等于8。我用console.log包围了“c”测试,这两个测试都会产生未定义的结果。给你。有人能解释一下发生了什么事吗?我不明白

为了防止无法访问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); 
}
var a=5;
函数runMe(a){
"严格使用",;
测试('a',函数(){
严格质量(a,6,‘检查a的值’);
});
函数innerRun(){
测试('b',函数(){
严格质量(b,7,‘检查b的值’);
});
控制台日志(c);
测试('c',函数(){
//问题似乎就在这里
严格质量(c,8,‘检查c的值’);
});
控制台日志(c);
}
var b=7;
innerRun();
var c=8;
} 
runMe(6);
对于(变量d=0;d<3;d++){
setTimeout(函数(){
测试('d',函数(){
严格限定(d,3,‘检查d的值’);
});
}, 100); 
}

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

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


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

显然,调用innerRun()时,c还没有设置,因此在“assertion c”测试期间它是未定义的。你是说对8的检查成功了吗?来检查一下。它似乎成功了。没有定义。所有
var
语句在块的开头一起移动。为了明确这一点,某些代码样式要求您在块的开头编写一条
var
语句。另请参见,但您如何解释John Resig的示例?为什么在他的代码中c是“未定义的”?这就是我想知道的。我首先想到的是吊装,但我无法解释John的结果。吊装解释了为什么定义了
c
。它实际具有值
8
的原因是,您为QUnit定义了一个测试函数,该函数稍后执行。Ib在这个小时间段内,分配
var c=8
发生,从而解释了结果。但是John Resig正在使用assert(),它会立即执行。很酷,谢谢@Odi,我会让这个答案浸泡一段时间,然后让他们标记它。