在浏览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。
答案 0 :(得分:1)
所有var
语句在块的开头一起移动(提升)。吊装解释了为什么定义c
。它实际上具有值8
的原因是,您为QUnit定义了一个测试函数,该函数稍后执行。
在函数定义和执行之间的小时间范围内,发生了赋值var c = 8
,从而解释了结果。但John Resig正在使用assert()
,它会立即执行。