لقد كان هذا الكائن دائمًا مأزقًا في JS ، ومن الصعب الحكم على ما يشير إليه. غالبًا ما نرتكب هذا النوع من الأخطاء بسبب تجربتنا من C ++ أو Python. بعد ذلك ، دعنا نتحدث عن ملكية هذا الكائن بالتفصيل.
القاعدة 1: هذا في البيئة العالمية
يتم تحديد بيئة JavaScript بطبيعتها بواسطة الوظائف. في JS ، لا يمكن فصل السياق بواسطة كتل التعليمات البرمجية. البيئة التي لا تلفها الوظائف هي البيئة العالمية. هذا في البيئة العالمية يشير إلى النافذة المتغيرة العالمية. انظر المثال التالي
نسخة الكود كما يلي:
var name = 'JJJ' ؛
console.log (this.name) ؛
// سيتم إخراج JJJ بنجاح
القاعدة 2: هذا عندما يسمى كطريقة
من الواضح أن هذا الموقف سهل الحكم ، وهو يتسق مع الذات في بيثون. هذا بلا شك يشير إلى الكائن الذي يدعو الطريقة
نسخة الكود كما يلي:
var user = {
الاسم: 'kkk'
} ؛
user.getName = function () {
console.log (this.name) ؛
} ؛
user.getName () ؛
// سيتم الإخراج KKK الإخراج
القاعدة 3: هذا عندما كمؤكد
لست بحاجة إلى أن أقول الكثير عن هذا في هذا الوقت. من الواضح أنه يشير إلى الكائن الذي تم إنشاؤه حديثًا. لا يقوم تشغيل المنشئ بإنشاء كائن بالفعل ، ولكنه مجرد تهيئة. يتم إنشاء الكائن قبل تشغيله.
فيما يلي بعض الأمثلة
نسخة الكود كما يلي:
مستخدم الوظيفة (الاسم) {
this.name = name ؛
}
var f1 = مستخدم جديد ('kkk') ؛
var f2 = user ('kkk') ؛
console.log (f1.name) ؛ // kkk
وحدة التحكم.
القاعدة 4: هذه الدعوة غير المباشرة
تشير ما يسمى المكالمة غير المباشرة إلى استخدام تطبيقات الطلب والاتصال بها ، وهذا يشير إلى المعلمة الأولى في قائمة المعلمات الخاصة بهم.
نسخة الكود كما يلي:
var setName = function (name) {
this.name = name ؛
} ؛
var user = {Level: 2} ؛
user.apply (setName ، 'JJJ') ؛
console.log (user.name) ؛ // jjj
القاعدة 5: هذا في حالات أخرى
تذكر أن هذا لن يتغير في مواقف أخرى ، وهذا هو أيضًا أسهل مكان لارتكاب الأخطاء.
نسخة الكود كما يلي:
var name = "Clever Coder" ؛
var person = {
الاسم: "Fooocoder" ،
مرحبا: وظيفة (sth) {
var sealhello = function (sth) {
console.log (this.name + "يقول" + sth) ؛
} ؛
Sayhello (STH) ؛
}
}
شخص
الرمز أعلاه يبدو غريبًا ، ألا ينبغي أن تكون هذه النقطة للشخص؟
يجب أن نتذكر أن هذا في الوظيفة المتداخلة لن يشير إلى الوظيفة التي تعششها. في هذا المثال ، لن يشير هذا في Sealhello إلى الوظيفة المقابلة لـ Hello. إذا قمنا بتغيير المثال قليلاً
نسخة الكود كما يلي:
مرحبا: وظيفة (sth) {
console.log (this.name + "يقول" + sth) ؛
}
// foocoder يقول مرحبا العالم
كان ينبغي على الجميع أن يفهموا أنه في هذا الوقت ، لا يدعو Sayhello كطريقة ، لذلك يشير هذا إلى الكائن العالمي. . .
في هذا الوقت ، تكمن المشكلة في أن المثال الأولي لاستخدام العقدة لتشغيله سيظهر غير محدد يقول Hello World. أتساءل عما إذا كان هناك أي سيد لشرح ذلك.
القاعدة 6: تقييم كل القواعد
تنتهي أخيرًا بمثال
نسخة الكود كما يلي:
var name = "Clever Coder" ؛
var user = {
الاسم: 'kkk'
} ؛
user.getName = function () {
console.log (this.name) ؛
} ؛
var get = user.getName ؛
GET () ؛ // المبرمج الذكي
هل تفهم؟