ÐоÑок вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² JavaScript ÑабоÑÐ°ÐµÑ Ð·Ð° ÑÑÑÑ Ñикла ÑобÑÑий (event loop), коÑоÑÑй оÑвеÑÐ°ÐµÑ Ð·Ð° вÑполнение кода, ÑбоÑа и обÑабоÑки ÑобÑÑий и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´-Ð·Ð°Ð´Ð°Ñ Ð¸Ð· оÑеÑеди (queued sub-tasks). ÐÑа Ð¼Ð¾Ð´ÐµÐ»Ñ Ð²ÐµÑÑма оÑлиÑаеÑÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ ÑзÑков пÑогÑаммиÑованиÑ, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº C и Java.
ÐонÑепÑÐ¸Ñ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑиклаРÑледÑÑÑей ÑекÑии обÑÑÑнÑеÑÑÑ ÑеоÑеÑиÑеÑÐºÐ°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ. СовÑеменнÑе JavaScript движки внедÑÑÑÑ/имплеменÑиÑÑÑÑ Ð¸ ÑÑÑеÑÑвенно опÑимизиÑÑÑÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ.
ÐизÑалÑное пÑедÑÑавлениеÐÐ»Ñ Ð»ÑÑÑего визÑалÑного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑабоÑÑ Event loop, ÐÑ Ð¼Ð¾Ð¶ÐµÑе ознакомиÑÑÑÑ Ñ Ð´Ð°Ð½Ð½Ñм видео: https://www.youtube.com/watch?v=8aGhZQkoFbQ&t=389s
СÑекÐÑзов лÑбой ÑÑнкÑии ÑоздаÑÑ ÐºÐ¾Ð½ÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (Execution Context). ÐÑи вÑзове вложенной ÑÑнкÑии ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй конÑекÑÑ, а ÑÑаÑÑй ÑÐ¾Ñ ÑанÑеÑÑÑ Ð² ÑпеÑиалÑной ÑÑÑÑкÑÑÑе даннÑÑ - ÑÑеке вÑзовов (Call Stack).
function f(b) {
var a = 12;
return a + b + 35;
}
function g(x) {
var m = 4;
return f(m * x);
}
g(21);
Ðогда вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ g
, ÑоздаÑÑÑÑ Ð¿ÐµÑвÑй конÑекÑÑ Ð²ÑполнениÑ, ÑодеÑжаÑий аÑгÑменÑÑ ÑÑнкÑии g
и локалÑнÑе пеÑеменнÑе. Ðогда g
вÑзÑÐ²Ð°ÐµÑ f
, ÑоздаÑÑÑÑ Ð²ÑоÑой конÑекÑÑ Ñ Ð°ÑгÑменÑами f
и ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑми пеÑеменнÑми. Ð ÑÑÐ¾Ñ ÐºÐ¾Ð½ÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ f
помеÑаеÑÑÑ Ð² ÑÑек вÑзовов вÑÑе пеÑвого. Ðогда f
возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑ, веÑÑ
ний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· ÑÑека ÑдалÑеÑÑÑ. Ðогда g
возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑ, ÐµÑ ÐºÐ¾Ð½ÑекÑÑ Ñакже ÑдалиÑÑÑ, и ÑÑек ÑÑановиÑÑÑ Ð¿ÑÑÑÑм.
ÐбÑекÑÑ ÑазмеÑаÑÑÑÑ Ð² кÑÑе. ÐÑÑа â ÑÑо пÑоÑÑо Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑой неÑÑÑÑкÑÑÑиÑованной облаÑÑи памÑÑи.
ÐÑеÑедÑСÑеда вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ JavaScript ÑодеÑÐ¶Ð¸Ñ Ð¾ÑеÑÐµÐ´Ñ Ð·Ð°Ð´Ð°Ñ. ÐÑа оÑеÑÐµÐ´Ñ â ÑпиÑок задаÑ, подлежаÑÐ¸Ñ Ð¾Ð±ÑабоÑке. ÐÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð´Ð°Ñа аÑÑоÑииÑÑеÑÑÑ Ñ Ð½ÐµÐºÐ¾ÑоÑой ÑÑнкÑией, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑабоÑаÑÑ ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ.
Ðогда ÑÑек полноÑÑÑÑ Ð¾ÑвобождаеÑÑÑ, ÑÐ°Ð¼Ð°Ñ Ð¿ÐµÑÐ²Ð°Ñ Ð·Ð°Ð´Ð°Ñа извлекаеÑÑÑ Ð¸Ð· оÑеÑеди и обÑабаÑÑваеÑÑÑ. ÐбÑабоÑка задаÑи ÑоÑÑÐ¾Ð¸Ñ Ð² вÑзове аÑÑоÑииÑованной Ñ Ð½ÐµÐ¹ ÑÑнкÑии Ñ Ð¿Ð°ÑамеÑÑами, запиÑаннÑми в ÑÑой задаÑе. Ðак обÑÑно, вÑзов ÑÑнкÑии ÑоздаÑÑ Ð½Ð¾Ð²Ñй конÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ заноÑиÑÑÑ Ð² ÑÑек вÑзовов.
ÐбÑабоÑка задаÑи заканÑиваеÑÑÑ, когда ÑÑек Ñнова ÑÑановиÑÑÑ Ð¿ÑÑÑÑм. СледÑÑÑÐ°Ñ Ð·Ð°Ð´Ð°Ñа извлекаеÑÑÑ Ð¸Ð· оÑеÑеди и наÑинаеÑÑÑ ÐµÑ Ð¾Ð±ÑабоÑка.
Цикл ÑобÑÑийÐÐ¾Ð´ÐµÐ»Ñ ÑобÑÑийного Ñикла (event loop
) назÑваеÑÑÑ Ñак поÑомÑ, ÑÑо оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ð½Ð¾Ð²Ñе ÑобÑÑÐ¸Ñ Ð² Ñикле:
while (queue.waitForMessage()) {
queue.processNextMessage();
}
queue.waitForMessage
Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿Ð¾ÑÑÑÐ¿Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ, еÑли оÑеÑÐµÐ´Ñ Ð¿ÑÑÑа.
ÐÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð´Ð°Ñа вÑполнÑеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ, пÑежде Ñем наÑнÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑледÑÑÑаÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¼Ñ ÑоÑно знаем: когда вÑполнÑеÑÑÑ ÑекÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ â она не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑиоÑÑановлена и бÑÐ´ÐµÑ Ñеликом завеÑÑена до наÑала вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÑÑгого кода (коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð´Ð°Ð½Ð½Ñе, Ñ ÐºÐ¾ÑоÑÑми ÑабоÑÐ°ÐµÑ ÑекÑÑÐ°Ñ ÑÑнкÑиÑ). ÐÑо оÑлиÑÐ°ÐµÑ JavaScript Ð¾Ñ Ñакого ÑзÑка пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ðº C. ÐоÑколÑÐºÑ Ð² С ÑÑнкÑиÑ, запÑÑÐµÐ½Ð½Ð°Ñ Ð² оÑделÑном поÑоке, в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÑановлена, ÑÑÐ¾Ð±Ñ Ð²ÑполниÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо дÑÑгой код в дÑÑгом поÑоке.
У данного Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° еÑÑÑ Ð¸ минÑÑÑ. ÐÑли задаÑа Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ ÑлиÑком много вÑемени, Ñо веб-пÑиложение не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð² ÑÑо вÑÐµÐ¼Ñ (напÑимеÑ, ÑкÑолл или клик). ÐÑаÑÐ·ÐµÑ ÑÑаÑаеÑÑÑ ÑмÑгÑиÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¸ вÑÐ²Ð¾Ð´Ð¸Ñ ÑообÑение "ÑкÑÐ¸Ð¿Ñ Ð²ÑполнÑеÑÑÑ ÑлиÑком долго" ("a script is taking too long to run") и пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¾ÑÑановиÑÑ ÐµÐ³Ð¾. ХоÑоÑей пÑакÑикой ÑвлÑеÑÑÑ Ñоздание задаÑ, коÑоÑÑе иÑполнÑÑÑÑÑ Ð±ÑÑÑÑо, и еÑли возможно, Ñазбиение одной задаÑи на неÑколÑко Ð¼ÐµÐ»ÐºÐ¸Ñ .
Ðобавление ÑобÑÑий в оÑеÑедÑРбÑаÑзеÑаÑ
ÑобÑÑÐ¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² оÑеÑÐµÐ´Ñ Ð² лÑбое вÑемÑ, еÑли ÑобÑÑие пÑоизоÑло, а Ñак же еÑли Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð¾Ð±ÑабоÑÑик. Ð ÑлÑÑае, еÑли обÑабоÑÑика Ð½ÐµÑ â ÑобÑÑие поÑеÑÑно. Так, клик по ÑлеменÑÑ, имеÑÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ Ð¿Ð¾ ÑобÑÑÐ¸Ñ click
, Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ ÑобÑÑие в оÑеÑедÑ, а еÑли обÑабоÑÑика Ð½ÐµÑ â Ñо и ÑобÑÑие в оÑеÑÐµÐ´Ñ Ð½Ðµ попадÑÑ.
ÐÑзов setTimeout Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ ÑобÑÑие в оÑеÑÐµÐ´Ñ Ð¿Ð¾ пÑоÑеÑÑвии вÑемени, Ñказанного во вÑоÑом аÑгÑменÑе вÑзова. ÐÑли оÑеÑÐµÐ´Ñ ÑобÑÑий на ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑÑÑа, Ñо ÑобÑÑие обÑабоÑаеÑÑÑ ÑÑÐ°Ð·Ñ Ð¶Ðµ, в пÑоÑивном ÑлÑÑае ÑобÑÑÐ¸Ñ ÑÑнкÑии setTimeout
пÑидÑÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑки оÑÑалÑнÑÑ
ÑобÑÑий в оÑеÑеди. Ðменно поÑÑÐ¾Ð¼Ñ Ð²ÑоÑой аÑгÑÐ¼ÐµÐ½Ñ setTimeout
коÑÑекÑно ÑÑиÑаÑÑ Ð½Ðµ вÑеменем, ÑеÑез коÑоÑое вÑполниÑÑÑ ÑÑнкÑÐ¸Ñ Ð¸Ð· пеÑвого аÑгÑменÑа, а минималÑное вÑемÑ, ÑеÑез коÑоÑое она ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑполниÑÑÑÑ.
ÐÑÐ»ÐµÐ²Ð°Ñ Ð·Ð°Ð´ÐµÑжка не даÑÑ Ð³Ð°ÑанÑии, ÑÑо обÑабоÑÑик вÑполниÑÑÑ ÑеÑез Ð½Ð¾Ð»Ñ Ð¼Ð¸Ð»Ð»Ð¸ÑекÑнд. ÐÑзов setTimeout
Ñ Ð°ÑгÑменÑом 0 (нолÑ) не завеÑÑиÑÑÑ Ð·Ð° Ñказанное вÑемÑ. ÐÑполнение завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ожидаÑÑиÑ
Ð·Ð°Ð´Ð°Ñ Ð² оÑеÑеди. ÐапÑимеÑ, ÑообÑение ''this is just a message'' из пÑимеÑа ниже бÑÐ´ÐµÑ Ð²Ñведено на конÑÐ¾Ð»Ñ ÑанÑÑе, Ñем пÑоизойдÑÑ Ð²Ñполнение обÑабоÑÑика cb1. ÐÑо пÑоизойдÑÑ, поÑÐ¾Ð¼Ñ ÑÑо задеÑжка â ÑÑо минималÑное вÑемÑ, коÑоÑое ÑÑебÑеÑÑÑ ÑÑеде вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð° обÑабоÑÐºÑ Ð·Ð°Ð¿ÑоÑа.
(function () {
console.log("this is the start");
setTimeout(function cb() {
console.log("this is a msg from call back");
});
console.log("this is just a message");
setTimeout(function cb1() {
console.log("this is a msg from call back1");
}, 0);
console.log("this is the end");
})();
// "this is the start"
// "this is just a message"
// "this is the end"
// "this is a msg from call back"
// "this is a msg from call back1"
СвÑÐ·Ñ Ð½ÐµÑколÑкиÑ
поÑоков Ð¼ÐµÐ¶Ð´Ñ Ñобой
Web Worker или кÑоÑÑ-доменнÑй ÑÑейм имеÑÑ Ñвой ÑобÑÑвеннÑй ÑÑек, кÑÑÑ Ð¸ оÑеÑÐµÐ´Ñ ÑобÑÑий. Ðва оÑделÑнÑÑ
ÑобÑÑийнÑÑ
поÑока могÑÑ ÑвÑзÑваÑÑÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом, ÑолÑко ÑеÑез оÑпÑÐ°Ð²ÐºÑ ÑообÑений Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода postMessage
. ÐÑÐ¾Ñ Ð¼ÐµÑод добавлÑÐµÑ ÑообÑение в оÑеÑÐµÐ´Ñ Ð´ÑÑгого, еÑли он конеÑно пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸Ñ
.
ÐÑÐµÐ½Ñ Ð¸Ð½ÑеÑеÑное ÑвойÑÑво Ñикла ÑобÑÑий в JavaScript, ÑÑо в оÑлиÑие Ð¾Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва дÑÑÐ³Ð¸Ñ ÑзÑков, поÑок вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не блокиÑÑеÑÑÑ. ÐбÑабоÑка I/O обÑÑно оÑÑÑеÑÑвлÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑобÑÑий и колбÑк-ÑÑнкÑий, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð¶Ðµ когда пÑиложение Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¾Ñ IndexedDB или оÑÐ²ÐµÑ Ð¾Ñ XHR, оно Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð´ÑÑгие пÑоÑеÑÑÑ, напÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий ввод.
СÑÑеÑÑвÑÑÑ Ñ
оÑоÑо извеÑÑнÑе иÑклÑÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº alert
или ÑинÑ
ÑоннÑй XHR, но ÑÑиÑаеÑÑÑ Ñ
оÑоÑей пÑакÑикой избегаÑÑ Ð¸Ñ
иÑполÑзованиÑ.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4