как сбросить переменную в JavaScript - PullRequest
0 голосов
/ 13 февраля 2019

это код

var x = Math.floor( Math.random() * 10 );
setInterval(function () {

    if (x >= 5) {
          $('.test').show();
          setTimeout(function () {
                         $('.test').hide();
                 }, 2000);
    } else {
        x = Math.floor( Math.random() * 10 );
    }

}, x * 1000);

этот код показывает .test с той же случайностью, как если бы x=8 останется 8 и не изменит то, что я действительно хочу, меняется xна другое число

Я пытался поместить var x в локальную область видимости, и это показывает, что x в setInterval не определено

Я хочу $('.test') показывает в случайном порядкепуть между 5 и 10 секундами, как первый раз, показанный после 7S, и второй раз, показанный после 9 секунд, и т. д. ...

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019
var x = Math.floor( Math.random() * 10 );
setInterval(function () {

    if (x >= 5) { // because of this, you get the same number for x. if x >= 5 then the x won't change in this block and has the last value forever.
          $('.test').show();
          setTimeout(function () {
                         $('.test').hide();
                 }, 2000);
    } else {
        x = Math.floor( Math.random() * 10 );
    }

}, x * 1000);
0 голосов
/ 13 февраля 2019

Я предлагаю перестроить ваш код и создать функцию, которая будет вызывать себя с setTimeout().Забудьте о setInterval() для этого ... Как и epascarello , упомянутый в комментарии, второй аргумент clearInterval() (миллисекунды интервала) будет настроен один раз, когда ваш код начнет работать, ифункция будет вызываться каждые N миллисекунд, где N - это первоначально настроенный интервал.

var x = Math.floor( Math.random() * 10 );

function test(x)
{
    console.log(x);

    if (x > 5)
    {
        $('.test').show();
        setTimeout(() => $('.test').hide(), 2000);
    }

    x = Math.floor( Math.random() * 25 );
    setTimeout(() => test(x), x * 1000);
}

test(x);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="test" style="display:none; background:skyblue">TEST</div>
0 голосов
/ 13 февраля 2019

Каждый раз задержка показа отличается с этим фрагментом.

function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

function showDiv(x){
  setTimeout(function () {
    $('.test').show();
    setTimeout(function () {
      $('.test').hide();
      x = getRandomArbitrary(5, 10)
      showDiv(x)
    }, 2000);
  }, x * 1000);
}

var x = getRandomArbitrary(5, 10)
showDiv(x)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="test" style="display: none">test</div>
0 голосов
/ 13 февраля 2019

Используйте setTimeout, setInterval будет работать только с интервалом, с которого вы впервые вызвали его.setTimeout запускается только один раз, а затем вы можете снова вызвать его с другой случайной величиной.

roll();

function roll() {
  var x = Math.floor( Math.random() * 10 );
  setTimeout(function () {
    if (x >= 5) {
      $('.test').show();
      setTimeout(function () {
        $('.test').hide();
      }, 2000);
    }
    roll();
  }, x * 1000);
}
.test {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="test">Test div</div>
...