область действия setTimeout

#javascript #scope #settimeout

#javascript #область действия #settimeout

Вопрос:

Допустим, у меня есть JS-код, подобный этому

 var num = 0;

function foo(input){
   num = input;

}


function bar(){
  setTimeout(foo(2), 100);//1

  setTimeout(function(){foo(5);},100);//2

  alert("num ="   num);//3

}
  

каков будет результат использования 1 и 3 ….. 2 и 3 … у меня есть результаты, но я не могу понять поведение… мы будем признательны за любую помощь с подробным объяснением…

Комментарии:

1. Фрагмент не работает ни в IE, ни в Firefox. В строке setTimeout(foo(2), 100); содержится ошибка «бесполезный вызов setTimeout (отсутствуют кавычки вокруг аргумента?)». Если я заключу это в кавычки, это ничего не даст: наконец num == 0 .

Ответ №1:

Это не проблема «области действия», а скорее проблема времени.

  1. Будет иметь побочный эффект в виде установки num значения 2. foo(2) выполняется прямо сейчас, и результат (мусор) передается в setTimeout . (То есть, foo(2) не выполняется как / в обратном вызове с таймаутом)……)……….. время ожидания.

  2. Вызовется foo(5) через ~ 100 миллисекунд. Анонимная функция действует как обратный вызов, который, в свою очередь, вызывает foo(5) , который будет иметь побочный эффект присвоения 5 num .

  3. Оповещения прямо сейчас. Значение будет «num = 2», потому что foo(2) выполнялось прямо сейчас (ну, незадолго до ;-), но foo(5) при обратном вызове будет запущено некоторое время спустя (и, следовательно, у него не было возможности установить num ).

Удачного кодирования.