我正在尝试测试一些代码,为此我需要在循环中进行一些测试,如下所示:
for (var i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
Click here for working example at jsFiddle
但由于某些原因,循环中的i
(和结果)总是6
,所以这段代码给出了这样的输出:
6
6
6
6
6
我做错了什么?
答案 0 :(得分:4)
鉴于QUnit在运行它们之前定义了所有测试,你是var
范围的经典问题的受害者 - var
被绑定到函数,而不是{{1} }循环。
这意味着:
您可以使用for
的给定值定义测试,但是当测试实际运行时,此值将会更改。
你有几种解决方法:
i
为什么会这样:上面的for (var i = 1; i <= 5; i++) {
(function (j) {
QUnit.test('Hello ' + j, (assert) => {
console.log(j);
assert.ok( 1 == '1', 'Result: ' + j);
});
})(i);
}
变量将绑定到该IIFE的范围。测试运行时,它的值不会改变。
j
关键字let
为什么会有效: ES6 finally introduces block scoping,但这是通过关键字for (let i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
或let
完成的。
这个答案的某些部分来自here