هذا هو كائن خاص داخل الوظيفة. يشير هذا إلى كائن البيئة بناءً على تنفيذ الوظيفة (سنقوم بتوضيحات إضافية في نهاية المقالة). قيمة هذا غير مؤكدة قبل استدعاء الوظيفة. سوف تسبب طرق الاتصال المختلفة هذه القيمة.
window.num = 22 ؛ var o = {num: 11} ؛ function saynum () {Alert (this.num)} saynum () ؛ // 22o.saynum = saynum ؛ o.saynum () ؛ // 11تذكر: اسم الوظيفة هو مجرد متغير يحتوي على مؤشر. لذلك ، حتى إذا تم تنفيذها في بيئات مختلفة ، فإن وظيفة saynum () العالمية لا تزال بنفس وظيفة O.Saynum ().
1. عند استدعاء وظيفة في النطاق العالمي
يسمى في النطاق العالمي ، يشير هذا الكائن إلى النافذة
إن تنفيذ وظائف مجهولة هو عالمي ، لذلك عادة ما يشير هذا الكائن إلى النافذة أيضًا.
الدالة fn1 () {console.log (this) ؛} fn1 () ؛2. دعا من خلال المشغل الجديد
يشير هذا إلى كائن مثيل
وظيفة الوظيفة (الاسم) {this.name = name ؛} person.prototype.printName = function () {Alert (this.name) ؛ // byron} ؛ var p1 = new شخص ('Byron') ؛3. تدعو الطريقة ككائنات
هذا يشير إلى الكائن
var obj1 = {name: 'byron' ، fn: function () {console.log (this) ؛ }} ؛ obj1.fn () ؛4. دعوة غير مباشرة
الاتصال والتطبيق
تحتوي كل وظيفة على طريقتين غير محددين: Call () وتطبيق (). الغرض من هاتين الطريقتين هو استدعاء وظائف في نطاق معين ، وهو ما يعادل في الواقع تعيين قيمة هذا الكائن في جسم الوظيفة. بمعنى آخر ، يتم استدعاء الوظيفة مباشرة ، ويتم تحديد بيئة التنفيذ عند الاتصال
window.color = 'red' ؛ var o = {color: 'blue'} ؛ function sexercolor () {Alert (this.color) ؛} saycolor.call (this) ؛ // redsaycolor.call (window) ؛ // redsaycolor.call (o) ؛(1) تطبيق الطريقة
تلقي معلمتين ، واحدة هي نطاق الوظيفة التي تعمل في الوظيفة ، والآخر هو صفيف المعلمة.
(2) طريقة الاتصال
طريقة الاتصال هي نفس طريقة التطبيق ، والفرق هو أن طريقة تلقي المعلمات مختلفة. بالنسبة لطريقة الاتصال ، فإن المعلمة الأولى هي أن هذه القيمة لم تتغير ، والتغيير هو أن المعلمات الأخرى يتم تمريرها مباشرة إلى الوظيفة.
الدالة fn () {console.log (this) // windwow function innerfn () {console.log (this)} innerfn.call (this) // window} fn () ؛ الدالة fn0 () {console.log (this) // window} function fn1 () {fn0.call (this) ؛ console.log (this) ؛ // window} fn1 () ؛ الدالة fn0 () {console.log (this) // object} var o = {fn1: function fn1 () {fn0.call (this) ؛ console.log (this) ؛ // object}} o.fn1 () ؛5. طريقة
تنشئ هذه الطريقة مثيلًا للدالة التي ترتبط قيمتها بالقيمة التي تم تمريرها إلى وظيفة BIND (). وهذا يعني أنه سيتم إرجاع وظيفة جديدة وسيكون هذا داخل الوظيفة هي المعلمة الأولى التي تم تمريرها.
window.color = 'red' ؛ var o = {color: 'blue'} ؛ function sexercolor () {Alert (this.color)} var objectsaycolor = saycolor.bind (o) ؛ objectsaycolor () ؛ // blue ؛ملاحظة تكميلية: تنفيذ تعريف البيئة
يحدد المتغيرات أو البيانات الأخرى التي يتمتع وظائف بإذن للوصول. كل بيئة تنفيذ لديها كائن متغير مرتبط به. يتم تخزين جميع المتغيرات والوظائف المحددة في البيئة في هذا الكائن. لا يمكن للرمز الذي نكتبه الوصول إلى هذا الكائن ، لكن المحلل سوف يستخدمه في الخلفية عند معالجة البيانات.
1. إنشاء بيئة التنفيذ:
1. بيئة التنفيذ العالمية
في متصفح الويب ، تعتبر بيئة التنفيذ العالمية كائن نافذة ، لذلك يتم إنشاء جميع المتغيرات والوظائف العالمية كخصائص وطرق كائن النافذة. عندما يتم تحميل الرمز في المتصفح ، يتم إنشاء بيئة التنفيذ العالمية (يتم تدمير بيئة التنفيذ العالمية فقط عندما نغلق صفحة الويب أو المتصفح).
2. بيئة التنفيذ المحلية
كل وظيفة لها بيئة التنفيذ الخاصة بها ، وبالتالي فإن بيئة التنفيذ المحلية هي كائن وظيفة. عندما يتم استدعاء وظيفة ، يتم إنشاء البيئة المحلية للوظيفة (بعد تنفيذ الكود في الوظيفة ، يتم تدمير البيئة ، ويتم تدمير جميع المتغيرات وتعريفات الوظائف المخزنة فيها).
بيئة التنفيذ هذه والكائنات المتغيرة ذات الصلة هي مفهوم مجردة ، كما يلي على النحو التالي
var a = 1 ؛ function fn (num1 ، num2) {var b = 2 ؛ دالة fninner () {var c = 3 ؛ تنبيه (A + B + C) ؛ } fninner () ؛ // إنشاء بيئة التنفيذ المحلية عندما يسمى fninner} fn (4،5) ؛ // إنشاء بيئة التنفيذ المحلية عند استدعاء FN2. سلسلة النطاق
يستخدم تنفيذ وظائف JavaScript سلسلة نطاق. يتم إنشاء سلسلة النطاق هذه عند تعريف الوظيفة. عندما يتم تعريف وظيفة ، فإنها في الواقع يحفظ سلسلة النطاق. عندما يتم استدعاء هذه الوظيفة ، فإنها تنشئ كائنًا جديدًا لتخزين متغيراتها المحلية وإضافة هذا الكائن إلى سلسلة النطاق المحفوظة. تعد الواجهة الأمامية لسلسلة النطاق دائمًا كائنًا متغيرًا في البيئة حيث يوجد الكود الذي يتم تنفيذه حاليًا. تعد نهاية سلسلة النطاق دائمًا كائنًا متغيرًا لبيئة التنفيذ العالمية. الغرض من سلسلة النطاق هو التأكد من أنه يُسمح للوصول إلى جميع المتغيرات والوظائف التي لديها إذن للوصول إلى بيئة التنفيذ.
var scope = 'global scope' ؛ function checkscope () {var scope = 'local scope' ؛ دالة f () {return scope} ؛ إرجاع f ؛} checkscope () () ؛ // النطاق المحليالفهم: عندما يتم استدعاء checkscope ، يتم تعريف الوظيفة f وترتبط بسلسلة نطاق checkscope كمتغير محلي. لذلك ، بغض النظر عن مكان استدعاء الوظيفة f ، فإن هذا الربط لا يزال صالحًا ، وبالتالي فإن قيمة الإرجاع هي النطاق المحلي.
var num1 = 1 ؛ function Outer () {var num2 = 2 ؛ console.log (num1 + num2) ؛ // 3 وظيفة inner () {// هنا يمكنك الوصول إلى num3 ، num2 ، num1 var num3 = 3 ؛ console.log (num1 + num2 + num3) ؛ // 6} // هنا يمكنك الوصول إلى num2 ، inner () ، num1 ولكن ليس num3 Inner () ؛سلسلة النطاق (البحث): يمكن للبيئة الداخلية الوصول إلى جميع البيئات الخارجية من خلال سلسلة النطاق ، لكن البيئة الخارجية لا يمكنها الوصول إلى أي متغيرات ووظائف في البيئة الداخلية.
var name = 'Byron' ؛ الدالة fn () {var name = 'csper' ؛ console.log (name) ؛ // casper} fn () ؛كلما زادت البيئة الداخلية ، كلما زاد الوزن المتغير.
ملاحظة: المتغيرات التي لم يتم الإعلان عنها مباشرة مع الكلمة الرئيسية VAR هي متغيرات عالمية. على سبيل المثال ، إذا تم الإعلان عن A = 1 مباشرة ، فإن A هو متغير عالمي في هذا الوقت.
عندما يدخل محرك Javscript النطاق ، سيقوم بمعالجة الكود في جولتين. الجولة الأولى ، تهيئة المتغيرات. الجولة الثانية ، تنفيذ الرمز
var a = 1 ؛ وظيفة السجن (a) {console.log (a) ؛ // 1 var a ؛ console.log (a) ؛ // 1} السجن (1) ؛3. تنفيذ الوظيفة
عندما تدخل استدعاء الدالة إلى بيئة التنفيذ ، فإن أول وسيطات المعالجة ، وتهيئة المعلمات الرسمية (القيمة الافتراضية غير محددة) ، ثم تهيئة إعلان الوظيفة في الوظيفة. عند تنفيذ الرمز خطوة بخطوة ، يتم تهيئة الإعلان المتغير في الوظيفة (عندما لا يتم تنفيذ الكود بعد إدخال البيئة ، تكون القيمة غير محددة). لذلك ، فإن ترتيب التهيئة في الوظيفة هو المعلمات الرسمية ، وإعلانات الوظائف ، والإعلانات المتغيرة. يمكن رؤيته من الصورة أعلاه. اسمحوا لي أن أعطيك مثالاً (البيئة العالمية بأكملها هي أيضًا وظيفة).
ALERT (typeof fn) ؛ // function ، إعلان الوظيفة مسبقًا التنبيه المسبق (typeof fn0) ؛ // إعلان غير محدد ، متغير مسبقًا ولكن لم يتم تعيين وظيفة fn () {// وظيفة التعبير