область действия setTimeout - PullRequest
2 голосов
/ 14 апреля 2011

Допустим, у меня есть такой код 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 Ответ

5 голосов
/ 14 апреля 2011

Это не проблема "охвата", а скорее проблема времени.

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

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

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

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

...