1

我正在构建一个小的随机序列比较器以学习 js 对象,目前我遇到了一个问题,如果我在我的 completeMessage() 中增加限制变量,这将在我的 compareSequences() 的 for 循环中自动运行在无限循环中,谁能告诉我我哪里可能出错了?

有问题的2种方法:

compareSequences: function() {                
    var instance = this;
    var i = 0;

    for( i; i <= limit; i++ ) {
        console.log('Limit inside loop:', limit);

        if( stacks.randomSequence[i] != stacks.userSequence[i] ) {
            instance.errorMessage();
            return;
        }                 

        if( i === limit ) {
            instance.completeMessage();
        }

        console.log('Limit now', limit);
    }               
},

completeMessage: function() {
    var instance = this;
    alert('Well done you where right!');
    limit = 5; //currently set as test, changing to ++ results in infinite loop
    instance.selectors.startButton.removeAttr('disabled');
    overallScore++;
    instance.selectors.scoreCounter.html(overallScore);
},

链接到我的小提琴:http: //jsfiddle.net/FNd79/22/

4

1 回答 1

2

默认情况下,您的limit变量在全局范围内定义(作为 object 的属性window),在一个函数中更改它的值会在任何地方更改它。

请务必使用var.

您的问题是您在循环期间修改了上限,每次退出循环时它都会增加一个。

您在初始化循环时需要全局值,您可以在那时将其复制到局部变量:

compareSequences: function() {                
  var instance = this;
  var i = 0;
  var max = limit;
  for( i; i <= max; i++ ) {
      ...
  }
  ...
}

您可以交替使用关键字break来确定退出循环。

if( i === limit ) {
  instance.completeMessage();
  break;
}
于 2012-08-08T13:24:36.207 回答