انظر إلى الكود التالي:
نسخة الكود كما يلي:
if (! ("aa" في النافذة)) {
تنبيه ("يا إلهي") ؛
var aa = 1 ؛
}
تنبيه ("AA" في النافذة) ؛
تنبيه (AA) ؛
أجب على الأسئلة التالية:
هل سيتم الإبلاغ عن خطأ؟ كم مرة ستظهر؟
هل التنبيه الثاني صحيح أم خطأ؟
ما يظهر في التنبيه الثالث؟
لماذا؟
فكر في الأمر ، ثم اختبره. إذا أجبت بشكل صحيح ، فلن تحتاج إلى قراءة المقالات التالية.
-----------------------------
تحديد المتغيرات في JS بسيط للغاية. يمكنك فقط استخدام var ، أو حتى بدون var:
نسخة الكود كما يلي:
var a = 1 ؛
هنا A هو الاسم المتغير و 1 هو القيمة المتغيرة. للأسف ، هذا أساسي للغاية. انظر إلى الكود التالي:
نسخة الكود كما يلي:
var a ؛
تنبيه (أ) ؛
في اختبار Firebug ، سوف يطفو على السطح غير المحدد. هذه سلسلة مألوفة للغاية ، والتي يبدو أنها تشير إلى أن المتغير غير محدد. لكنني أعتقد أنني قد تختلف بالفعل ، هذا هو التعريف ، ولكن لا توجد قيمة متصلة.
دعونا نفعل شيئًا غير محدد حقًا:
نسخة الكود كما يلي:
تنبيه (أ) ؛
هذا صحيح ، فقط قم بتنبيه متغير لم يظهر مطلقًا على الإطلاق. ماذا سيحدث؟
أبلغ Firebug مباشرة عن خطأ: A لم يتم تعريفه. وهذا يعني أنه لم يتم تعريفه. الجمع بين الكود السابق ، وهذا أمر مربك. ما هو الفرق بين هذا غير المحدد وغير المحدد السابق؟
في الواقع ، فإن الكود السابق يعادل هذا:
نسخة الكود كما يلي:
var a = غير محدد ؛
تنبيه (أ) ؛
بمعنى آخر ، عندما يتم الإعلان عن متغير دون تعيين قيمة ، فإن JS سوف يمرر قيمة غير محددة إلى المتغير. لاحظ أن هذه "قيمة" ، مما يعني أن A بالفعل لها قيمة ، وتسمى هذه القيمة "غير محددة".
لم تظهر المتغيرات وراء التنبيه المباشر أبدًا ، مما يعني أن هذا هو غير محدد حقيقي.
ببساطة: لا يوجد متغير بدون قيمة في JS ، ويتم تعيين القيمة عند الإعلان عن المتغير.
ثم ننظر إلى الكود التالي:
نسخة الكود كما يلي:
تنبيه (أ) ؛
var a = 1 ؛
هل سيقوم هذا الرمز بالإبلاغ عن خطأ؟ لأنه عندما يكون التنبيه في حالة تأهب ، لم يظهر المتغير A بعد.
ولكن لا يوجد خطأ في هذه الطريقة ، ولكن هناك قيمة غير محددة تظهر. إنه يشير إلى وجود المتغير A بالفعل ، لكن القيمة ليست ما نريد ، ولكنه غير محدد. ما هي المشكلة؟
نظرًا لأن إعلان VAR المتغير هو نفس إعلان الوظيفة ، فسيتم ذلك في الواقع ، يبدو أن الكود أعلاه يبدو:
نسخة الكود كما يلي:
var a ؛
تنبيه (أ) ؛
أ = 1 ؛
بهذه الطريقة سوف تفهم.
لذلك ، فإن مفتاح هذه المشكلة هو: سيصل إعلان VAR إلى الجزء العلوي من النطاق مقدمًا ، لكن القيمة المرفقة لن تكون - بيئة متشابكة للغاية ، لا أعرف لماذا فعلت ذلك. أنا شخصياً أعتقد أن هذا عيب من JS.
هناك عادةً رمزًا بعد أن وضع المدافعون إعلانات متغيرة أمام النطاق ، وربما بالنظر إلى هذا - حتى لو لم تكتبها في المقدمة ، فإن JS سوف يمضي قدمًا مسبقًا.
الآن اسمحوا لي أن أصدر إجابة السؤال في بداية المقالة:
لن يطفو تنبيهان فقط ، والتنبيه إذا لم يتم تنفيذه ، لأن إعلان VAR متقدم ، يبدو الرمز الحقيقي مثل هذا:
نسخة الكود كما يلي:
var aa ؛
if (! ("aa" في النافذة)) {
تنبيه ("يا إلهي") ؛
AA = 1 ؛
}
تنبيه ("AA" في النافذة) ؛
تنبيه (AA) ؛
على الرغم من أن AA فارغ ، إلا أنه سيكون صحيحًا عند الحكم عليه من قبل "AA" في النافذة ، لأن A موجود والقيمة غير محددة. لذلك إذا لم يتم تنفيذ الكود. لن أتحدث عن التنبيهات الأخيرة.
أنا شخصياً أشعر أن هذا سؤال غير منطقي للغاية. يجب أن نفهم أسبابه ، لكن نحتقره كخيال.
السؤال أعلاه هو أيضًا سبب كتب هذا المقال. لقد رأيت هذا الرمز من مقال عبر الإنترنت ، ولكن لا يوجد إجابة فيه. لم أستطع ضرب أختي ، لذلك ذهبت إلى Stackoverflow وطلبت معرفة ذلك. الجواب هو هذا المقال.
ولكن هذا سؤال أساسي للغاية ، في الواقع! ! !
هاها ، سامحني ، هناك سؤال آخر:
نسخة الكود كما يلي:
var b = {}
تنبيه (B.AA) ؛
تنبيه (B.AA.BB) ؛
هذه أيضًا طريقة لإعلان المتغيرات. لذا ، هل سيبلغ هذا الرمز عن خطأ؟ لماذا؟