JavaScript函数导致循环结束?

时间:2018-07-30 12:43:56

标签: javascript

我的函数和循环有问题,不确定为什么。

var a = ['1,0,1', '0,1,0', '1,1,1'];
var b = [1, 1, 1];

function myFunction() {
  for (i = 0; i < a.length; i++) {
    var user = a[i].split(',');
    var cs = cosinesim(user, b);
    document.getElementById("cs").innerHTML += String(user) + '  ' + String(cs) + '<br>';
    cs = 0;
    user = '';
  }
}

function cosinesim(A, B) {
  var dotproduct = 0;
  var mA = 0;
  var mB = 0;
  for (i = 0; i < A.length; i++) {
    dotproduct += (parseInt(A[i]) * parseInt(B[i]));
    mA += (parseInt(A[i]) * parseInt(A[i]));
    mB += (parseInt(B[i]) * parseInt(B[i]));
  }
  mA = Math.sqrt(mA);
  mB = Math.sqrt(mB);
  if ((mA * mB) == 0) {
    var similarity = 0
  } else {
    var similarity = (dotproduct) / (mA * mB)
  }

  return similarity;
}
<p id="cs"></p>
<button onclick="myFunction()">Click</button>

我正在尝试让函数遍历数组并打印出数组中每个元素的余弦相似度,但是它只打印第一个?如果删除cs变量和计算,该函数将打印出所有用户。我不确定为什么在函数中添加余弦函数会导致它仅运行一次?

任何帮助表示感谢,谢谢。

1 个答案:

答案 0 :(得分:5)

您在两个函数中都使用了相同的(全局)变量i。您应该在每个变量中将i声明为局部变量:

var i;

或在for循环中:

for (var i = 0; ...

因为两个循环当前都使用相同的i,所以一旦运行cosinesim()函数,第一个函数中的循环也将结束。

如果以“严格”模式进行编码,则会因此类隐式的全局用法而出错。