QUnit - 循环测试,索引始终相同
QUnit - test in loop, index always the same
我正在尝试测试一些代码,为此我需要在循环中进行一些测试,如下所示:
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
我做错了什么?
鉴于 QUnit 在 运行 之前定义所有测试,您是 var
作用域经典问题的受害者 - var
绑定到函数,不要进入 for
循环。
这个意思是:
您使用 i
的给定值定义测试,但当测试实际上是 运行ning 时,此值将发生变化。
您有几种解决方法:
创建一个 IIFE 并在其中定义您的测试
for (var i = 1; i <= 5; i++) {
(function (j) {
QUnit.test('Hello ' + j, (assert) => {
console.log(j);
assert.ok( 1 == '1', 'Result: ' + j);
});
})(i);
}
为什么会这样: 上面的 j
变量将绑定到该 IIFE 的范围。当测试为运行.
时其值不会改变
在 ES6 环境中使用 let
关键字
for (let i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
为什么这样做: ES6 finally introduces block scoping,但这是通过关键字 let
或 const
.
完成的
此答案的某些部分从 here
得到证实
我正在尝试测试一些代码,为此我需要在循环中进行一些测试,如下所示:
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
我做错了什么?
鉴于 QUnit 在 运行 之前定义所有测试,您是 var
作用域经典问题的受害者 - var
绑定到函数,不要进入 for
循环。
这个意思是:
您使用 i
的给定值定义测试,但当测试实际上是 运行ning 时,此值将发生变化。
您有几种解决方法:
创建一个 IIFE 并在其中定义您的测试
for (var i = 1; i <= 5; i++) {
(function (j) {
QUnit.test('Hello ' + j, (assert) => {
console.log(j);
assert.ok( 1 == '1', 'Result: ' + j);
});
})(i);
}
为什么会这样: 上面的 j
变量将绑定到该 IIFE 的范围。当测试为运行.
在 ES6 环境中使用 let
关键字
for (let i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
为什么这样做: ES6 finally introduces block scoping,但这是通过关键字 let
或 const
.
此答案的某些部分从 here
得到证实