تحت النطاق العالمي
هذا؛
عند استخدام هذا في نطاق عالمي ، فإنه يشير إلى كائن عالمي.
فيما يلي مقدمة مفصلة للكائن العالمي:
الكائن العالمي هو كائن تم إنشاؤه قبل إدخال أي سياق تنفيذ ؛
لا يوجد سوى نسخة واحدة من هذا الكائن ، ويمكن الوصول إلى خصائصه في أي مكان في البرنامج. تنتهي دورة حياة الكائن العالمي في اللحظة التي يخرج فيها البرنامج.
في مرحلة الإنشاء الأولية للكائن العالمي ، تتم تهيئة الرياضيات ، السلسلة ، التاريخ ، الحاجز كسمات خاصة به ، وما إلى ذلك ، ويمكن أيضًا إنشاء كائنات إضافية أخرى كسمات (والتي يمكن أن تشير إلى الكائن العالمي نفسه). على سبيل المثال ، في DOM ، يمكن أن تشير خاصية نافذة الكائن العالمي إلى الكائن العالمي نفسه.
لذلك هو نفس هذا. window في وحدة التحكم.
عند استدعاء وظيفة
foo () ؛
هنا ، هذا يشير أيضا إلى الكائن العالمي.
عند استدعاء الطريقة
test.foo () ؛
في هذا المثال ، سيشير هذا إلى كائن الاختبار.
عند استدعاء مُنشئ
New Foo () ؛
يتم استخدام وظيفة مع الكلمة الرئيسية الجديدة عند الاتصال ، والتي نسميها مُنشئًا. في هذا الوقت ، داخل الوظيفة ، يشير هذا إلى الكائن الذي تم إنشاؤه حديثًا.
عندما ضبط صراحة
دالة foo (a ، b ، c) {} // var bar = {} ؛ foo.apply (bar ، [1 ، 2 ، 3]) ؛ // سوف يتوسع Array إلى extofoo.call (شريط ، 1 ، 2 ، 3) ؛ // يؤدي إلى a = 1 ، b = 2 ، c = 3عند استخدام أساليب تطبيق الدالة.
لذلك ، على عكس القواعد عند استدعاء وظيفة ، فإن هذا في المثال أعلاه يشير إلى شريط.
فيما يلي المكالمة وتطبيق الأساليب:
طريقة الاتصال :
بناء الجملة: اتصل ([thisobj [، arg1 [، arg2 [، [، .argn]]]]]))
التعريف: اتصل بأسلوب كائن لاستبدال الكائن الحالي بكائن آخر.
تطبيق الطريقة :
بناء الجملة: تطبيق ([thisobj [، argarray]])
التعريف: تطبيق طريقة واحدة لكائن معين واستبدل الكائن الحالي بكائن آخر.
نحتاج هنا إلى ملاحظة أنه لا يمكن استخدام هذا للإشارة إلى الكائن نفسه عندما يتم الإعلان عن الكائن حرفيًا. على النحو التالي:
var obj = {me: this}هنا ، لن يشير هذا إلى OBJ ، ويقتصر تطبيق هذا على المواقف الخمسة المذكورة أعلاه.
لخص
على الرغم من أن الموقف أعلاه مفيد في الغالب ، إلا أن هذا في الحالة الثانية (أي عند استدعاء وظيفة) نادرًا ما يكون مفيدًا في الواقع ، وهو ما يعتبر خطأً آخر في تصميم JavaScript.
foo.method = function () {function test () {// هذا يتم تعيينه على الكائن العالمي} test () ؛}كما ذكرنا أعلاه ، سيشير هذا هنا إلى الكائن العالمي ، وليس وظيفة FOO.
من أجل الحصول على طريقة للإشارة إلى FOO في الاختبار ، نحتاج إلى إنشاء متغير محلي داخل الطريقة التي يشير إلى FOO.
foo.method = function () {var that = this ؛ اختبار الوظيفة () {// استخدم ذلك بدلاً من هذا هنا} test () ؛}هذا مجرد اسم متغير طبيعي ، ولكن غالبًا ما يتم استخدامه للإشارة إلى هذا الخارجي.
هناك شيء آخر مثير للاهتمام يتعلق بالاسم المستعار للوظيفة ، أي عندما يتم تعيين طريقة لمتغير.
var test = someObject.MethodTest ؛ test () ؛
في المثال أعلاه ، سيتم التعامل مع الاختبار كدالة طبيعية ، لذلك وفقًا للحالة الثانية (أي عندما يتم استدعاء وظيفة) ، فإن هذا بداخله يشير إلى متغير عالمي ، وليس إلى حد ما.
على الرغم من أن هذا الربط المتأخر يبدو قرارًا سيئًا في البداية ، إلا أنه في الواقع أساس ميراث النموذج الأولي.
Function Foo () {} foo.prototype.method = function () {} ؛ function bar () {} bar.prototype = foo.prototype ؛ new bar (). method () ؛في هذه المرحلة ، عندما يتم استدعاء الطريقة ، فإنه سيشير إلى كائن مثيل الشريط.