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,但这是通过关键字 letconst.

完成的

此答案的某些部分从 here

得到证实