Сборка от 17 марта 2017 г


Что выведет после setInterval?



Download 9,9 Mb.
bet334/349
Sana26.04.2022
Hajmi9,9 Mb.
#582433
TuriУчебник
1   ...   330   331   332   333   334   335   336   337   ...   349
Bog'liq
ilja kantor sovremennyj uchebnik-1chast PdfToWord

Что выведет после setInterval?


Вызов alert(i) в setTimeout введет 100000001 . Можете проверить это запуском:


var timer = setInterval(function() { i++;
}, 10);

setTimeout(function() {


clearInterval(timer); alert( i ); // (*)
}, 50);
var i; function f() {
// точное время выполнения не играет роли
// здесь оно заведомо больше 100 мс for (i = 0; i < 1e8; i++) f[i % 2] = i;
} f();

Правильный вариант срабатывания: 3 (сразу же по окончании f один раз).


Планирование setInterval будет вызывать функцию каждые 10 мс после текущего времени. Но так как интерпретатор занят долгой функцией, то до конца ее работы никакого вызова не происходит.


За время выполнения f может пройти время, на которое запланированы несколько вызовов setInterval , но в этом случае остается только один, т.е. накопления вызовов не происходит. Такова логика работы setInterval .


После окончания текущего скрипта интерпретатор обращается к очереди запланированных вызовов, видит в ней setInterval и выполняет. А затем тут же выполняется setTimeout , очередь которого тут же подошла.


Итого, как раз и видим, что setInterval выполнился ровно 1 раз по окончании работы функции. Такое поведение кросс‑браузерно.


К условию





Кто быстрее?


Задача – с небольшим «нюансом».


Есть браузеры, в которых на время работы JavaScript таймер «застывает», например таков IE. В них количество шагов будет почти одинаковым,
±1.

В других браузерах (Chrome) первый бегун будет быстрее. Создадим реальные объекты Runner и запустим их для проверки:


function Runner() { this.steps = 0;

this.step = function() { this.doSomethingHeavy(); this.steps++;


};

function fib(n) {


return n <= 1 ? n : fib(n ‐ 1) + fib(n ‐ 2);
}

this.doSomethingHeavy = function() { for (var i = 0; i < 25; i++) {


this[i] = fib(i);
}
};

}


var runner1 = new Runner(); var runner2 = new Runner();

// запускаем бегунов


var t1 = setInterval(function() { runner1.step();
}, 15);

var t2 = setTimeout(function go() { runner2.step();


t2 = setTimeout(go, 15);
}, 15);

// кто сделает больше шагов? setTimeout(function() {


clearInterval(t1); clearTimeout(t2); alert( runner1.steps ); alert( runner2.steps );
}, 5000);

Если бы в шаге step() не было вызова doSomethingHeavy() , то есть он бы не требовал времени, то количество шагов было бы почти равным.


Но так как у нас шаг, всё же, что‑то делает, и функция doSomethingHeavy() специально написана таким образом, что она требует (небольшого) времени, то первый бегун успеет сделать больше шагов. Ведь в setTimeout пауза 15 мс будет между шагами, а setInterval шагает равномерно, каждые 15 мс. Получается чаще.


К условию






Download 9,9 Mb.

Do'stlaringiz bilan baham:
1   ...   330   331   332   333   334   335   336   337   ...   349




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish