الوضع الصارم
سطر هذه الصفحة هو ReferenceError. الوضع الصارم يقطع أخطاء كانت تمضي بلا صوت. ضع "use strict" قبل أي عبارة. بعد ذلك، size = "regular" من غير let ومن غير const لا يصنع اسمًا عامًا، والمحرك يرمي ReferenceError.
مهمتان سابقتان لا تتكرران هنا
قائمة المهام انتهت عند done: buy tea. صفحة الأخطاء رمت new Error("missing size") عن قصد، وقرأ catch تلك الرسالة. هذه الصفحة لا ترمي Error من صنعك. المحرك يرمي لأن size لم يُصرَّح عنه. console.error ما زال لا يرمي.
أين يقف التوجيه
"use strict" يعمل فقط إن كان أول عبارة في السكربت، أو أول عبارة داخل دالة واحدة. سلسلة تأتي لاحقًا تعبير عادي ولا تبدل شيئًا. يجوز أن تكون دالة واحدة صارمة وبقية السكربت ليست كذلك. الوحدات صارمة من الأصل، فالتوجيه هناك زائد.
setSize قبل أن تراه
setSize تسند إلى size من غير تصريح. النداء موضوع داخل try. لن يظهر size عام.
"use strict";
function setSize() {
size = "regular";
}
try {
setSize();
} catch (error) {
console.log(error.name);
}
ما يُطبع في السجل هو ReferenceError. الإصلاح أن تصرّح: let size = "regular". إذا كان drink هو tea وهذا size مُصرَّحًا، يستطيع label أن يعيد tea / regular. والطريق الآخر الذي يصح هو الكتابة في order.size، لأن ذلك الاسم موجود.
نداء بالاسم ونداء على الكائن
مناداة الدالة باسمها لا تضبط this. في هذا الوضع this هي undefined. مناداة المنهج على order تجعل this ذلك الكائن، فيصير this.drink هو tea.
"use strict";
function bare() {
return this;
}
const order = {
drink: "tea",
label() {
return this.drink;
}
};
console.log(bare());
console.log(order.label());
السجلان يأتيان undefined ثم tea. لا تقرأ this.drink من داخل bare. ليس هناك كائن، وتلك القراءة ترمي.
أربعة فروق
العمود الأيسر هو السلوك الصامت القديم. العمود الأيمن هو أثر التوجيه.
📊 ما الذي يتبدل
| السلوك الصامت القديم | مع "use strict" |
|---|---|
| إسناد size = "regular" بلا تصريح ينشئ اسمًا عامًا | ReferenceError |
| this داخل bare هو الكائن العام | undefined |
| المعامل المكرر يفوز فيه الأخير | SyntaxError |
| delete على متغير مُصرَّح يُرجع false | SyntaxError |
معامل مكرر، أو delete size، يفشل والسكربت ما زال يُقرأ، فيكون SyntaxError ولا يصل try إلى التقاطه. ReferenceError الآتي من الإسناد يحدث حين تعمل الدالة، فيراه catch. أما delete order.drink فيبقى مسموحًا في الوضعين إذا أمكن إزالة الخاصية.
ماذا تفعل الصفحة
الصفحة سكربت صارم واحد. يفشل الإسناد، ويُكتب اسم الخطأ على الصفحة.
<!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. ضع let قبل size فيتوقف هذا catch عن العمل.
خمس خطوات لهذه النتائج
- شغّل setSize تحت "use strict". السجل ReferenceError.
- اجعل الإسناد let size = "regular". يختفي الرمي.
- نادِ bare(). القيمة undefined.
- نادِ order.label(). القيمة tea.
- اقرأ الصفحة. السطر ReferenceError.
ما يقع فعلًا
- وضع التوجيه بعد عبارة سبقت
- انتظار أن إسنادًا بلا تصريح يصنع اسمًا عامًا
- قراءة this.drink داخل نداء bare
- التقاط معامل مكرر بواسطة try
- قراءة السطر كأنه done: buy tea
- قراءته كأنه caught / missing size
احفظ هذا
- التوجيه أولًا
- size = "regular" بلا تصريح يرمي ReferenceError
- this في bare هي undefined، وorder.label() يعيد tea
- تكرار المعاملات وdelete على متغير كلاهما فشل نحوي SyntaxError
- سطر الصفحة هو ReferenceError
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى