يتضمن JavaScript مفاهيم مثل Scope (Scope) ، وسلسلة النطاق (سلسلة النطاق) ، والسياق التنفيذ (سياق التنفيذ) ، والكائن النشط (الكائن النشط) ، والنطاق الديناميكي (النطاق الديناميكي) ، والإغلاق (الإغلاق). لفهم هذه المفاهيم ، نقوم بتحليلها من كل من الجوانب الثابتة والديناميكية.
أولاً ، دعنا نكتب وظيفة بسيطة لتقديم مثال:
نسخة الكود كما يلي:
وظيفة إضافة (num1 ، num2) {
var sum = num1 + num2 ؛
إرجاع مجموع
}
نحدد وظيفة إضافة مع معلمتين رسميتين.
الجوانب الثابتة:
عند إنشاء وظيفة إضافة ، سيقوم محرك JavaScript بإنشاء سلسلة نطاق من وظيفة إضافة ، وتشير سلسلة النطاق هذه إلى السياق العالمي. إذا كنت تستخدم تمثيلات رسومية ، يتم عرض الشكل التالي:
كما يتضح من الشكل أعلاه ، عند إنشاء وظيفة الإضافة ، تم إنشاء سلسلة النطاق ، لذلك يمكننا استنتاج أن سلسلة نطاق الوظيفة يتم إنشاؤها عند إنشاء الوظيفة ، بدلاً من فترة التشغيل الديناميكية. دعونا نلقي نظرة على ما يحدث أثناء التشغيل الديناميكي.
الجوانب الديناميكية:
عند تنفيذ وظيفة إضافة ، ستقوم JavaScript بإنشاء سياق تنفيذ ، والذي يحتوي على جميع المعلومات المطلوبة أثناء وقت تشغيل وظيفة إضافة. تنفيذ السياق أيضا سلسلة نطاقها الخاصة. عند تشغيل الوظيفة ، سيقوم محرك JavaScript أولاً بتهيئة سلسلة النطاق لسياق التنفيذ من سلسلة نطاق وظيفة إضافة ، ثم يقوم محرك JavaScript بإنشاء كائن نشط ، والذي يحتوي على جميع المتغيرات المحلية والمعلمات والمتغيرات الأخرى أثناء تشغيل الوظيفة.
إذا تم وصف الصورة ، فما يحدث أثناء التشغيل الديناميكي لوظيفة الإضافة ، يمكن وصفها في الشكل التالي:
كما يتضح من الشكل أعلاه ، فإن سياق التنفيذ هو مفهوم ديناميكي. يتم إنشاؤه عند تشغيل الوظيفة. في الوقت نفسه ، يعد كائن الكائن النشط أيضًا مفهومًا ديناميكيًا. تتم الإشارة إليها بواسطة سلسلة نطاق سياق التنفيذ. لذلك ، يمكن أن نستنتج أن كل من سياق التنفيذ والكائن النشط هو مفاهيم ديناميكية ، ويتم تهيئة سلسلة نطاق سياق التنفيذ بواسطة سلسلة نطاق الوظيفة.
يتحدث أعلاه عن نطاق نطاق الوظيفة وسياق التنفيذ. دعنا نتحدث عن مشكلة النطاق الديناميكي. عندما يمر JavaScript مع عبارات ، تجرب جمل الصيد ، وطرق Eval ، فإن محرك JavaScript سيغير ديناميكي نطاق سياق التنفيذ. دعونا نلقي نظرة عليه مع مثال:
نسخة الكود كما يلي:
وظيفة initui () {
مع (وثيقة) {// تجنب!
var bd = الجسم ،
Links = getElementsByTagname ("A") ،
أنا = 0 ،
len = links.length ؛
بينما (أنا <len) {
تحديث (الروابط [i ++]) ؛
}
getElementByid ("GO-BTN"). onClick = function () {
يبدأ()؛
} ؛
bd.className = "Active" ؛
}
عند تنفيذ وظيفة initui أعلاه ، ستنشئ JavaScript ديناميكيًا نطاقًا مقابلًا يتوافق مع البيان مع وضعه في الواجهة الأمامية لسلسلة نطاق سياق التنفيذ. يمكن وصف العملية أعلاه بوضوح من خلال الشكل أدناه. تُظهر المنطقة ذات العلامات الحمراء أدناه النطاق الناتج عن البيان مع.
أخيرًا ، دعونا نلقي نظرة على الإغلاق الأكثر غموضًا في JavaScript. الإغلاق هي في الواقع وظيفة في جافا سكريبت. يتم إنشاء الإغلاق خلال وقت تشغيل الوظيفة. لنأخذ مثالًا لنرى:
نسخة الكود كما يلي:
وظيفة ensideEvents () {
var id = "xdi9592" ؛
document.getElementById ("Save-BTN"). onClick = function (event) {
SaveOcument (id) ؛
} ؛
}
عند تنفيذ وظيفة المحالفين المذكورة أعلاه ، سيتم إنشاء إغلاق ، وسيشير هذا الإغلاق إلى متغير المعرف في نطاق المحالات. إذا ، وفقًا للغة البرمجة التقليدية ، يكون ID متغيرًا مخزنًا على المكدس. عند تنفيذ الوظيفة ، يختفي المعرف ، فكيف يمكن الرجوع إليه مرة أخرى؟ من الواضح أن جافا سكريبت تتبنى طريقة أخرى هنا. دعونا نلقي نظرة على كيفية إغلاق JavaScript. عند تنفيذ وظيفة envisionevents ، سيقوم محرك JavaScript بإنشاء سلسلة نطاق لسياق تنفيذ دالة ensignevents. تحتوي سلسلة النطاق هذه على الكائنات النشطة عند تنفيذ العدادين. في الوقت نفسه ، سيقوم محرك JavaScript أيضًا بإنشاء إغلاق ، وسوف تشير سلسلة نطاق الإغلاق أيضًا إلى الكائنات النشطة عند تنفيذ المحالات. وبهذه الطريقة ، عندما يتم تنفيذ العوائد ، على الرغم من أن سلسلة نطاق سياق التنفيذ الخاص بها لم تعد تشير إلى الكائنات النشطة ، فإن الإغلاق لا يزال يشير إلى الكائنات النشطة المقابلة لوقت تشغيل المحالات ، مما يفسر آلية الإغلاق داخل JavaScript. يمكنك استخدام الشكل التالي لوصف حالة تشغيل وظيفة المخصصات أعلاه:
كما يتضح من ما سبق ، بعد تنفيذ وظيفة ensidevents ، document.getElementById ("Save-BTN"). يشير OnClick إلى الإغلاق. بهذه الطريقة ، عندما ينقر المستخدم على حفظ BTN ، سيتم تشغيل تنفيذ الإغلاق. دعونا نلقي نظرة على الموقف عند تنفيذ الإغلاق. كما ذكرنا سابقًا ، فإن الإغلاق في JavaScript هي في الواقع وظائف ، وبالتالي فإن حالات تنفيذ الإغلاق وتنفيذ الوظائف متسقة. سوف يصف الرقم التالي بوضوح الإغلاق المرتبط بحدث OnClick أعلاه.
من الشكل أعلاه ، يمكننا أن نرى أن محرك JavaScript أولاً ينشئ سياق تنفيذ الإغلاق ، ثم يستخدم سلسلة نطاق الإغلاق لتهيئة سلسلة سياق التنفيذ من الإغلاق ، وأخيراً يضع الكائن النشط المقابل عند تنفيذ الإغلاق في الطرف الأمامي من النطاق ، مما يتحقق أيضًا من أن الإغلاق هو وظيفة.