در حال بارگذاری...

حالت سخت‌گیرانه

حالت سخت‌گیرانه چند اشتباه بی‌صدا را قبول نمی‌کند. "use strict" را همان اول بگذار. بعد از آن، size = "regular" اگر با let یا const ساخته نشده باشد ReferenceError می‌دهد و متغیر سراسری نمی‌سازد. خط این صفحه ReferenceError است.

نه فهرست کار است، نه صفحهٔ خطاها

فهرست کار روی done: buy tea تمام شد. صفحهٔ خطاها خودش new Error("missing size") را پرتاب کرد و catch همان پیام را خواند. اینجا Error خودت را پرتاب نمی‌کنی. موتور خطا می‌دهد چون نام size اصلاً ساخته نشده. console.error هنوز هم پرتاب نمی‌کند.

این دستور باید اول باشد

"use strict" فقط وقتی اثر دارد که اولین دستور اسکریپت باشد، یا اولین دستور داخل یک تابع. اگر همان رشته را پایین‌تر بنویسی، یک عبارت معمولی است و هیچ چیز را عوض نمی‌کند. می‌شود فقط یک تابع را سخت‌گیر کرد و بقیهٔ اسکریپت را نه. ماژول از قبل سخت‌گیر است؛ گذاشتن دوبارهٔ این دستور آنجا اضافی است.

نام ساخته‌نشده واقعاً شکست است

setSize به size مقدار می‌دهد بدون اینکه آن را بسازد. فراخوانی داخل try است. در این حالت، size سراسری ساخته نمی‌شود.

انتساب بدون اعلان

javascript
"use strict";
function setSize() {
size = "regular";
}
try {
setSize();
} catch (error) {
console.log(error.name);
}

لاگ ReferenceError است. تعمیرش این است که نام را بسازی: let size = "regular". اگر نوشیدنی tea باشد و size همین‌طور اعلام شده باشد، برچسب می‌تواند tea / regular برگردد. راه درست دیگر این است که order.size را بنویسی، چون آن نام وجود دارد.

فراخوانی تنها this ندارد

اگر تابع را فقط با نامش صدا بزنی، this تنظیم نمی‌شود. در حالت سخت‌گیرانه مقدارش undefined است. اگر متد را روی خود سفارش صدا بزنی، this همان شیء است و this.drink برابر tea می‌شود.

this در فراخوانی خالی

javascript
"use strict";
function bare() {
return this;
}
const order = {
drink: "tea",
label() {
return this.drink;
}
};
console.log(bare());
console.log(order.label());

لاگ‌ها undefined و بعد tea هستند. داخل bare سراغ this.drink نرو. آنجا شیئی نیست و آن خواندن خودش خطا می‌دهد.

چهار فرق که ارزش یاد گرفتن دارد

ستون چپ رفتار قدیمی و بی‌صداست. ستون راست کار همین دستور است.

📊 حالت سخت‌گیرانه چه را عوض می‌کند

وضعیت بدون این دستور با "use strict"
size = "regular" بدون اعلان یک نام سراسری می‌سازد ReferenceError
this در فراخوانی خالی شیء سراسری undefined
دو پارامتر همنام آخری می‌ماند SyntaxError
delete روی متغیر اعلام‌شده false برمی‌گرداند SyntaxError

پارامتر تکراری و delete size موقع خواندن اسکریپت می‌شکنند، برای همین try به آن‌ها نمی‌رسد. ReferenceError انتساب وقتی پیش می‌آید که تابع اجرا شود، پس catch آن را می‌بیند. حذف ویژگی شیء، مثل delete order.drink، در هر دو حالت هنوز مجاز است اگر آن ویژگی قابل حذف باشد.

خط صفحه

صفحه یک اسکریپت سخت‌گیر است. انتساب شکست می‌خورد و نام همان خطا روی صفحه نوشته می‌شود.

نمایش صفحه — ReferenceError

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
"use strict";
const line = document.querySelector("#line");
try {
size = "regular";
} catch (error) {
line.textContent = error.name;
}
</script>
</body>
</html>

خط ReferenceError است. done: buy tea نیست و caught / missing size هم نیست. اگر جلوی size بنویسی let، این catch دیگر اجرا نمی‌شود.

پشت پیشخوان

  1. setSize را زیر "use strict" اجرا کن. لاگ ReferenceError است.
  2. انتساب را به let size = "regular" عوض کن. دیگر پرتابی نیست.
  3. bare() را صدا بزن. مقدار undefined است.
  4. order.label() را صدا بزن. مقدار tea است.
  5. صفحه را بخوان. خط ReferenceError است.

جاهایی که اشتباه می‌شود

این دستور توضیح نیست که هر جای فایل بگذاری. صدازدن متد با صدازدن تنها یکی نیست.

  • گذاشتن "use strict" بعد از یک دستور دیگر، که هیچ اثری ندارد
  • انتظار اینکه انتساب بدون اعلان یک نام سراسری بسازد
  • خواندن this.drink داخل فراخوانی تنها
  • گرفتن پارامتر تکراری با try، در حالی که اسکریپت اصلاً خوانده نمی‌شود
  • خواندن خط به‌شکل done: buy tea
  • خواندن خط به‌شکل caught / missing size

این‌ها را نگه دار

  • "use strict" باید اولین دستور اسکریپت یا همان تابع باشد
  • size = "regular" بدون اعلان ReferenceError می‌دهد
  • this در فراخوانی تنها undefined است؛ order.label() هنوز tea برمی‌گرداند
  • پارامتر تکراری و delete روی متغیر، خطای نحوی‌اند
  • خط صفحه ReferenceError است

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
6
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود