#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:
Это не проблема «области действия», а скорее проблема времени.
-
Будет иметь побочный эффект в виде установки
num
значения 2.foo(2)
выполняется прямо сейчас, и результат (мусор) передается вsetTimeout
. (То есть,foo(2)
не выполняется как / в обратном вызове с таймаутом)……)……….. время ожидания. -
Вызовется
foo(5)
через ~ 100 миллисекунд. Анонимная функция действует как обратный вызов, который, в свою очередь, вызываетfoo(5)
, который будет иметь побочный эффект присвоения 5num
. -
Оповещения прямо сейчас. Значение будет «num = 2», потому что
foo(2)
выполнялось прямо сейчас (ну, незадолго до ;-), ноfoo(5)
при обратном вызове будет запущено некоторое время спустя (и, следовательно, у него не было возможности установитьnum
).
Удачного кодирования.