javascript - 在函数中保留变量

标签 javascript

我有一个计时器循环,我希望每三个循环执行一个操作,然后在第四个循环上执行另一个操作,然后重复自身。我认为下面的方法可行,但发现下次执行 MyLoop() 时未定义 counter 。如果我在全局命名空间中声明它,它将被定义,但是每个循环将不会有自己的计时器。如何在 MyLoop() 中保留 counter 值?

function MyLoop(t) {
  console.log(counter);
  if (typeof counter === 'undefined') {
    var counter = 0;
  }
  setTimeout(function() {
    if (counter >= 3) {
      console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter = 0;
    } else {
      console.log('SUB:  Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter++
    }
    MyLoop(t);
  }, t * 1000);
}

MyLoop(2);
MyLoop(4);

最佳答案

演示该问题的非常小的样本:

function S(condition) { 
  var v; 
  if (condition) {v  = 42;} 
}
S(true);
S(false); 

您是否希望在第二次调用时将 v 设置为 42?可能不会,第二次调用 MyLoop 时也是如此。

您每次迭代都会重新创建闭包 - 而不是重新使用您首先调用的相同函数:

function MyLoop(t) {
  console.log(counter);
  if (typeof counter === 'undefined') {
    var counter = 0;
  }
  var onTick = function() {
    if (counter >= 3) {
      console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter = 0;
    } else {
      console.log('SUB:  Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter++
    }
     setTimeout(onTick, t * 1000);
  };
  setTimeout(onTick, t * 1000);
}

或者,您可以使用正确的计数器重新创建函数:

function MyLoop(t, counter) {

 counter = counter || 0;

 setTimeout(function() {
    if (counter >= 3) {
      console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter = 0;
    } else {
      console.log('SUB:  Counter: ' + counter + ' Loop ' + t + ' seconds.')
      counter++
    }
    MyLoop(t, counter); // creates new function with updated counter
  }, t * 1000);
}

关于javascript - 在函数中保留变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39359251/

相关文章:

javascript - bootstrap 后缀不能与 firefox 一起正常工作

javascript - React-native SectionList 项目索引在部分之间继续

php - 在 xmlhttprequest 加载的页面中运行 javascript

javascript - 跨域查询

javascript - 如何在 Google App Engine 上存储 HTML 5 地理位置数据?

javascript - 如何将字体系列导出为英文

javascript - 当我使用通知 div 时,Href 标签不起作用

javascript - jQuery获取div的top值的方法

javascript - 如何防止仅在按退格键时关闭 Bootstrap 模式

javascript - XHTML 中 noscript 标签的可行替代方案是什么