زمانبندی
کتری یک پاراگراف است، #pot. اسکریپت داخلش cold مینویسد. اینجا فرم نیست و زنگ پیشخوان هم نیست.
تایمر اسکریپت را نگه نمیدارد. خط بعدی همان لحظه اجرا میشود. تابع تایمر دیرتر نوبت میگیرد. timeout با ۴۰۰ میلیثانیه hot مینویسد. اگر لغوش کنی، کتری سرد میماند. interval یکییکی تا ۳ میشمارد و بعد میایستد. خط میشود cold / hot / 3.
این زنگ پیشخوان نیست
صفحهٔ قبل same / 4 / undefined / number را به هم چسباند. آنجا سند، یک var، یک let و نوع عرض بود. این صفحه آنها را نمیخواند. cold و hot کلمههایی هستند که تایمر روی کتری مینویسد.
سؤال این است که کلمه کِی عوض میشود.
خط بعدی صبر نمیکند
setTimeout یک تابع میخواهد و یک تأخیر به میلیثانیه. ۴۰۰ یعنی چهار دهم ثانیه، نه ۴۰۰ ثانیه. لاگی که زیر این فراخوانی است اول درمیآید، وقتی کتری هنوز cold است. تابع تایمر دیرتر hot مینویسد و همان را لاگ میکند.
let pot = document.getElementById("pot");
pot.textContent = "cold";
setTimeout(function () {
pot.textContent = "hot";
console.log(pot.textContent);
}, 400);
console.log(pot.textContent);
لاگ اول cold است. لاگ بعدی hot. اسکریپت ۴۰۰ میلیثانیه همانجا ننشست.
جوش را لغو کن
setTimeout یک شناسه برمیگرداند. clearTimeout با همان شناسه، تابع را کنار میگذارد. کتری cold شده بود و hot هرگز نمیآید.
let pot = document.getElementById("pot");
pot.textContent = "cold";
let boil = setTimeout(function () {
pot.textContent = "hot";
}, 400);
clearTimeout(boil);
console.log(pot.textContent);
لاگ cold است. تابع کنار گذاشته شد، پس کتری hot نمیشود.
سه بار بریز
setInterval تابع را هی تکرار میکند، اینجا هر ۳۰۰ میلیثانیه. هر بار یکی اضافه میشود. روی ۳، clearInterval قطعش میکند. لاگ همان ۳ است، نه شمارشی که تمام نشود.
let pot = document.getElementById("pot");
let n = 0;
let tick = setInterval(function () {
n = n + 1;
pot.textContent = String(n);
if (n === 3) {
clearInterval(tick);
console.log(pot.textContent);
}
}, 300);
لاگ 3 است. شناسهٔ interval همان tick است. بیclearInterval شمارش بالا میرفت.
شناسه عدد است
چیزی که setTimeout برمیگرداند عدد است. نه خود تأخیر است، نه کلمهٔ hot. این قطعه یک تابع خالی را فقط برای دیدن نوع شناسه وقت میگذارد و بعد لغوش میکند تا چیز دیگری اجرا نشود.
let boil = setTimeout(function () {}, 400);
console.log(typeof boil);
clearTimeout(boil);
لاگ number است.
صفر هم دیرتر است
تأخیر ۰ یعنی «قبل از خط بعد» نیست. تابع صبر میکند تا همین اسکریپت تمام شود. کتری now میشود، همان کلمه لاگ میشود، و بعد تابع تایمر later را لاگ میکند.
let pot = document.getElementById("pot");
pot.textContent = "now";
setTimeout(function () {
console.log("later");
}, 0);
console.log(pot.textContent);
لاگ اول now است. لاگ دوم later. صفر جلوی صف نپرید.
تأخیر یعنی چه
واحد میلیثانیه است. ردیف کتری همان است که این صفحه به کار میبرد.
📊 تأخیر یعنی چه
| تأخیر | یعنی | قاطیکردن آسان |
|---|---|---|
| 0 | بعد از تمام شدن همین اسکریپت | قبل از خط بعد |
| 400 | ۰٫۴ ثانیه | ۴۰۰ ثانیه |
| 1000 | یک ثانیه | یک دقیقه |
خط زیر کتری
اسکریپت cold را مینویسد و همان لحظه ذخیره میکند. timeoutِ ۴۰۰ میلیثانیه hot را ذخیره میکند. interval هر ۳۰۰ میلیثانیه یکی اضافه میکند، روی ۳ میایستد، و بعد سه کلمه را به هم میچسباند. hot زودتر از بار سوم ذخیره میشود، چون ۴۰۰ از ۹۰۰ کوچکتر است.
<!DOCTYPE html>
<html>
<head>
<title>kettle-timer — page</title>
</head>
<body>
<p id="pot">blank</p>
<p id="line">…</p>
<script>
let pot = document.getElementById("pot");
let seen = [];
pot.textContent = "cold";
seen.push(pot.textContent);
setTimeout(function () {
pot.textContent = "hot";
seen.push("hot");
}, 400);
let n = 0;
let tick = setInterval(function () {
n = n + 1;
if (n === 3) {
clearInterval(tick);
seen.push(String(n));
document.getElementById("line").textContent = seen.join(" / ");
}
}, 300);
</script>
</body>
</html>
خط cold / hot / 3 است. cold همان لحظه بود. hot از timeout آمد. ۳ از interval آمد. کلمهٔ blank رفته. same / 4 / undefined / number مال صفحهٔ قبلی است.
پشت پیشخوان
- کتری را cold بگذار، hot را برای ۴۰۰ میلیثانیه وقت بگذار، و همان لحظه لاگ بگیر. لاگ اول cold است. لاگ بعدی hot.
- hot را وقت بگذار، بعد پیش از اجرا
clearTimeoutبزن. لاگ cold میماند. - با
setIntervalبشمار و روی ۳ بایست. لاگ ۳ است. typeofشناسه را بخوان. لاگ number است.- تأخیر را ۰ بگذار. لاگها now هستند، بعد later.
- خط صفحه را بخوان: cold / hot / 3.
اشتباههای پشت پیشخوان
کتری cold یا hot یا یک شمارش را نشان میدهد. خط زنگ را نشان نمیدهد.
- انتظار اینکه لاگ اول hot باشد
- نزدن
clearTimeout، تا همان جوش باز hot بنویسد - ول کردن interval تا از ۳ بگذرد
- ۴۰۰ را ۴۰۰ ثانیه حساب کردن
- گرفتن تأخیر ۰ بهجای «قبل از خط بعد»
- خواندن خط بهصورت same / 4 / undefined / number
این را نگه دار
- خط بعدی پیش از تابع timeout اجرا میشود
clearTimeoutآن تابع را برمیدارد و کتری cold میماندclearIntervalشمارش را روی ۳ قطع میکند- شناسهای که
setTimeoutمیدهد عدد است - تأخیر ۰ هم اول now را لاگ میکند، بعد later
- خط صفحه cold / hot / 3 است
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود