Smx*_*Cde 5 javascript jquery qunit
我正在尝试测试一些代码,为此我需要在循环中进行一些测试,如下所示:
for (var i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因i,循环(和结果)总是6如此,所以这段代码给出了这样的输出:
6
6
6
6
6
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
鉴于 QUnit 在运行测试之前定义了所有测试,您将成为经典var范围问题的受害者 - vars 绑定到函数,而不是循环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);
}
Run Code Online (Sandbox Code Playgroud)
为什么这样有效:上面的变量j将绑定到 IIFE 的范围。当测试运行时它的值不会改变。
let在ES6环境中使用关键字for (let i = 1; i <= 5; i++) {
QUnit.test('Hello ' + i, (assert) => {
console.log(i);
assert.ok( 1 == '1', 'Result: ' + i);
});
}
Run Code Online (Sandbox Code Playgroud)
为什么这样有效: ES6 最终引入了块作用域,但这是通过关键字let或 来完成的const。
这个答案的某些部分从这里得到证实