القاعدة الذهبية الأولى:
لا يوجد لدى JS نطاق على مستوى الكتلة (يمكنك تنفيذه بنفسك مع الإغلاق أو الأساليب الأخرى) ، فقط نطاق على مستوى الوظيفة. يمكن العثور على المتغيرات خارج الوظيفة في الوظيفة ، ولكن لا يمكن العثور على المتغيرات داخل الوظيفة في الخارج.
الأول:
لماذا هذا؟ ؟
var a = 10 ؛ function aaa () {// step-4alert (a) ؛ // step-5-> تنفيذ التنبيه ، في هذا الوقت ، يمكنك فقط العثور على الخارج A = 10 وبالتالي فإن المربع المنبثق 10} bbb () {// step-2var a = 20 ؛ aaa () ؛في الواقع ، يفهم الجميع المبدأ ، يجب أن يكون مجرد مسألة أخطاء سهلة ، وسيتغير كل شيء.
المرحلة الثانية:
لماذا هذا؟ لأنه عندما يتم تعيين A B ، لا يتم تعريف B بعد ، لذلك A غير محدد و B هو 10.
المادة 2 من الرمز الذهبي:
البحث عن المتغيرات هو مبدأ القرب. للعثور على المتغيرات المحددة بواسطة VAR ، عندما لا يتم العثور عليها في مكان قريب ، ثم ابحث عن الطبقة الخارجية.
ينظر:
لماذا هذا؟ هناك سببان لهذا: أحدهما هو التحليل المسبق ، والآخر يبحث في مكان قريب.
var a = 10 ؛ function aaa () {Alert (a) ؛ // undefined. عند البحث عن A ، سوف تبحث في الوظيفة. نظرًا لتأثير الإرهاق المسبق ، يتم تحديد A في هذا الوقت ، لذلك لن تبحث أبدًا عن 10 var a = 20 ؛/*preparsing var aalert (a) ؛ var a = 20 ؛*/} aaa () ؛انتباه:
دعنا نتحقق من العنصر الثاني. على الرغم من أنه مبدأ القرب ، فإنه هو العثور على المتغير الذي أعلنه VAR القريب. وذلك لأن المتغيرات التي أعلنها VAR عالمي. هنا ، يتم تعديل قيمة A فقط. لذا فإن ما سبق هو أنه لم يتم العثور على A Var في الوظيفة ، لذلك خرجت ووجدتها بمجرد أن بحثت ، لذلك نبهت 10 ؛ ولكن الحقيقة هي أنه بعد A = 20 ، تبلغ A في الواقع 20 ، لكن لم يتم تنفيذها بعد عند تنبيهها ~~
انظر ~
المثال التالي يتحقق من نطاق وظيفة JS:
هذا لأنه عندما يكون التنبيه (أ) ، فإن وظيفة BBB هي بالفعل 20 ، ولكنها محلية لتنبيه الجملة (أ) في هذا الوقت. لا يمكن للتنبيه (أ) العثور على وظيفة في BBB ، لذلك لا يمكن العثور على وظيفة في AAA ، لذلك يخرج ويجد 10.
المادة 3 من الرمز الذهبي:
عندما يتم تكرار المعلمات مع المتغيرات المحلية ، تكون الأولوية مكافئة.
مثال:
أيضًا: عند تمرير المعلمات ، يمرر النوع الأساسي القيمة ، ونوع المرجع يمرر المرجع. (ولكن ليس هذا هو الحال بعد إعادة التعيين)
var a = 5 ؛ var b = a ؛ b += 3 ؛ تنبيه (a) ؛ // 5var a = [1،2،3] ؛ var b = a ؛ b.push (4) ؛ تنبيه (a) ؛ // [1،2،3،4] ؛
لا توجد مشكلة في الكود أعلاه ، ولكن ما يلي مختلف.
لأنه تم إعادة تعيين B ، لا يشير إلى.
علاوة على ذلك ، يتشابه نطاق المعلمات والمتغيرات:
قارن هذين:
المعلمات المذكورة أعلاه هي أنواع أساسية ، ويتم تمرير القيم فقط. فيما يلي نوع مرجعي: (يتضمن أيضًا حالة إعادة التعيين)