Консоль JavaScript есть ошибки?что это за значения, возвращаемые setTimeout в консоли? - PullRequest
0 голосов
/ 07 марта 2019

При запуске следующего кода в консоли

var ajout1 = function(number) {
  number = number || 100;
  console.log(number + 1);
}

setTimeout(ajout1, 1000);
setTimeout(ajout1(500), 2000); // evaluates immediately and returns nothing but this is "by design" to show how NOT to write your timeout
setTimeout(function() {
  ajout1(1000)
}, 3000);

можно ожидать следующего результата

t+1: 101
t+2: 501
t+3: 1001

Если вы присмотритесь более внимательно, вы увидите, что t2 будет немедленно оценено и поэтому не будет ждать 2 секунды, прежде чем вернуться. (Это «по замыслу». Оно учит (мне), как не писать тайм-аут). Таким образом, ожидаемый результат становится:

t+0: 501
t+1: 101
t+3: 1001

На самом деле я действительно получаю

t+0: 501
t+0: <X
t+1: 101
t+3: 1001

С Х постоянно растущей ценностью. Я думаю, что X - это таймер, поэтому я переписал свой код как

var t1=setTimeout(ajout1,1000);
var t2=setTimeout(ajout1(500),2000);// no good
var t3=setTimeout(function(){ajout1(1000)},3000);

теперь вывод

t+0: 501
t+0: <undefined
t+1: 101
t+3: 1001

Если я оцениваю t1, t2, t3, их значения равны X + 1, X + 2, X + 3. Так что я думаю, моя ставка X была правильной. Мой вопрос: почему консоль выводит значение только 1 счетчика, а не три? Почему я получил "неопределенное" значение.

Я тестировал в консоли Chrome и Edge с одинаковыми результатами

1 Ответ

1 голос
/ 07 марта 2019

Что происходит в вашем втором setTimeout()?

setTimeout(ajout1(500)/*evaluates immediately and returns nothing*/,2000);

А затем этот код выглядит следующим образом:

setTimeout(undefined,2000); //undefined, because ajout1(500) didn't return anything

, а затем

setTimeout("undefined",2000); //Coerced to string

... и через 2 секунды ...

eval("undefined") //Altough not really eval, but similar to it.
...