Как переназначение переменной timeout влияет на Settimeout - PullRequest
1 голос
/ 21 апреля 2020

Учтите это:

var x = null;

function a() {
  x = window.setTimeout(() => {
    alert("hello")
  })
}

a();

function b() {
  window.clearTimeout(x);
  alert("bye")
}

b();

Приведенный выше фрагмент будет печатать только bye, а не hello. Однако, если я просто переназначу x в методе b, будут напечатаны и hello, и bye. Какой механизм?

var x = null;

function a() {
  x = window.setTimeout(() => {
    alert("hello")
  })
}

a();

function b() {
  x = undefined;
  window.clearTimeout(x);
  alert("bye")
}

b();

Ответы [ 2 ]

4 голосов
/ 21 апреля 2020

«Переменная времени ожидания» - это просто число, идентификатор времени ожидания. Переназначение переменной, которой назначен номер, само по себе не является проблемой, но если вы хотите очистить тайм-аут, вам придется передать тот же ID тайм-аута в clearTimeout. Просто для иллюстрации, а не то, что вы должны делать это в реальном коде, вы можете вызвать setTimeout в начале загрузки страницы и получить идентификатор тайм-аута 1, затем вызвать clearTimeout с 1, и тайм-аут будет очищен:

x = window.setTimeout(() => {
  alert("hello")
});
window.clearTimeout(1);

Сама переменная не является чем-то особенным, это просто значение , число, которое вам нужно отслеживать, чтобы вы могли передать его clearTimeout.

Во втором фрагменте, поскольку вы присваиваете undefined на x до выполнения clearTimeout(x), интерпретатор не знает о текущем таймауте с идентификатором undefined, поэтому он ничего не очищает.

Вы также можете присвоить идентификационный номер тайм-аута переменной другой и очистить исходную переменную:

var x = null;

function a() {

  x = window.setTimeout(() => {
    alert("hello")
  })
}
a();

function b() {
  const savedX = x;
  x = undefined;
  window.clearTimeout(savedX);
  alert("bye")
}
b();
0 голосов
/ 21 апреля 2020

Это потому, что window.clearTimeout(x); сначала вызывает и сбрасывает тайм-ауты, поэтому нет предупреждения hello.

Если вы используете setTimeout без параметра задержки, он выполняет следующий цикл событий, что означает после b() выполнение в вашем случае.

Во втором сценарии вы переназначаете x на undefined, чтобы x больше не указывал на тот же setTiemout ID. Следовательно, window.clearTimeout(x) не очищает время ожидания.

Из документов MDN

задержка

Время в миллисекундах (тысячных долях секунду), таймер должен дождаться выполнения указанной функции или кода. Если этот аргумент опущен, используется значение 0, что означает выполнение «немедленно» или, точнее, в следующем цикле событий. Обратите внимание, что в любом случае фактическая задержка может быть больше, чем предполагалось;

...