保留函数中的变量

时间:2016-09-06 23:35:51

标签: javascript

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

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);

2 个答案:

答案 0 :(得分:1)

证明问题的非常小的样本:

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);
}

答案 1 :(得分:0)

这是一个递归函数,可以实现您的需要。

    <div>
{foreach from=$feature.variants item="var" name="var"}
    {if $smarty.foreach.var.iteration == ($smarty.foreach.var.total % 2)}
    </div>
    <div class="ty-product-feature__value">
    {/if}
    {$var.variant}
{/foreach}
    </div>

使用setTimeout

function theCountDown(tm, n) {
    window.setTimeout( myLoop(n) , tm * 1000);
}

function myLoop (t) {
var counter = t;

    if (counter > 1) {
        counter--;
      console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.');

      myLoop(counter);
    } else {
      console.log('SUB:  Counter: ' + counter + ' Loop ' + t + ' seconds.');
    }
}

myLoop(8);