JavaScript函数导致循环结束?

Fut*_*ure 0 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;
}
Run Code Online (Sandbox Code Playgroud)
<p id="cs"></p>
<button onclick="myFunction()">Click</button>
Run Code Online (Sandbox Code Playgroud)

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

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

Poi*_*nty 5

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

var i;
Run Code Online (Sandbox Code Playgroud)

或在for循环中:

for (var i = 0; ...
Run Code Online (Sandbox Code Playgroud)

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

如果您在"严格"模式下编码,则会从此类隐式全局用法中收到错误.

  • 使用let而不是var将进一步改善'i'的范围,以防@Future扩展他的代码. (3认同)