声纳规则:不应在循环内定义函数

时间:2018-08-22 14:10:35

标签: javascript function loops sonarqube

在循环内部定义函数可能会产生意外的结果,因为在幕后,仅定义了该函数的单个实例。循环迭代不创建新的函数实例,而只是更新函数的变量。而是应返回该函数。

不兼容的代码示例

var funs = [];
for (var i = 0; i < 13; i++) {
  funs[i] = function() { // Non-Compliant
    return i;
  };
}
print(funs[0]()); // 13 instead of 0
print(funs[1]()); // 13 instead of 1
print(funs[2]()); // 13 instead of 2
print(funs[3]()); // 13 instead of 3

...

我一直在思考,但无法找出兼容的解决方案。应该是什么?

1 个答案:

答案 0 :(得分:0)

使用局部变量即可解决问题。

var funs = [];
for (var i = 0; i < 13; i++) {
  let localIndex = i;
  funs[i] = function() { // Non-Compliant
    return localIndex;
  };
}
print(funs[0]()); // 0
print(funs[1]()); // 1
print(funs[2]()); // 2
print(funs[3]()); // 3