مقدمة
1. نوع المرجع
النوع المرجعي هو نوع داخلي في JavaScript. يتم استخدامه بشكل أساسي كمرجع لاستبدال المتغير أو الوظيفة. بالطبع، عندما تكون هناك حاجة إلى القيمة الحقيقية، يمكن العثور على القيمة الحقيقية من خلالها.
2. هيكل النوع المرجعي
تتكون قيمة النوع المرجعي من جزأين: أحدهما هو الكائن الذي ينتمي إليه الكائن المشار إليه بقيمة النوع المرجعي، والآخر هو اسم الكائن المشار إليه في الأساس . ممثلة في الكود الزائف:
انسخ رمز الكود كما يلي:
فار valueOfReferenceType = {
القاعدة: <الكائن الأساسي>،
اسم الخاصية: <اسم الخاصية>
};
3. سيناريوهات الاستخدام
هناك نوعان من سيناريوهات الاستخدام لأنواع المراجع:
(1) عند معالجة معرف
المعرفات هي أسماء المتغيرات وأسماء الوظائف وأسماء معلمات الوظائف وأسماء الخصائص غير المعروفة في الكائنات العامة.
(2) عند تجهيز خاصية الواصل
انسخ رمز الكود كما يلي:
فار فو = 10؛
شريط الوظائف (){}
في النتائج المتوسطة للعملية، يتوافق النوع المرجعي مع
انسخ رمز الكود كما يلي:
فار fooReference = {
القاعدة: عالمية،
اسم العقار: "فو"
};
فار بارالمرجع = {
القاعدة: عالمية،
اسم العقار: "شريط"
};
لا يزال من الضروري شرح القاعدة هنا في JavaScript، كل الكائنات أو الوظائف لها كائناتها الخاصة. أي شخص قرأ مقالتي السابقة يعرف أن هناك كائنًا متغيرًا في كل سياق تنفيذ لإدارة المتغيرات أو الوظائف في سياق التنفيذ هذا. .
لذلك، عند التعامل مع المعرفات:
في السياق العالمي، من البديهي أن نقول أن القاعدة === globalVO === gloabal
في سياق تنفيذ الوظيفة، الأساس === VO/AO
لكن خصائص كائن المعالجة هي:
وهذا أبسط، base === OWERObject
4. احصل على القيمة الحقيقية لنوع المرجع
كما قلنا في البداية، نوع المرجع هو مجرد مرجع، لكنه لا يخزن القيمة الحقيقية. عند الحاجة إلى القيمة الحقيقية، يمكن الحصول عليها من خلال سلسلة من الخوارزميات الداخلية. يمكننا وصف هذه الخوارزمية برمز زائف بسيط:
انسخ رمز الكود كما يلي:
الدالة GetValue(القيمة) {
إذا (النوع (القيمة)!= المرجع) {
قيمة الإرجاع؛
}
var base = GetBase(value);
إذا (قاعدة === فارغة) {
رمي خطأ مرجعي جديد؛
}
قاعدة الإرجاع.[[Get]](GetPropertyName(value));
}
تقوم طريقة [[Get]] الداخلية بإرجاع القيمة الحقيقية لخصائص الكائن، بما في ذلك تحليل الخصائص الموروثة في سلسلة النموذج الأولي. لذلك من خلال GetValue يمكننا أيضًا الحصول بسهولة على القيمة الحقيقية للنوع المرجعي. على سبيل المثال:
انسخ رمز الكود كما يلي:
GetValue(fooReference);//10
GetValue(barReference); // كائن الدالة "شريط"
إذن متى نحتاج إلى الحصول على القيمة الحقيقية للنوع المرجعي؟
بشكل عام، عند الحاجة إلى تعيين نوع مرجعي أو المشاركة في عملية ما أو استدعائه، يجب الحصول على القيمة الحقيقية من خلال طريقة GetValue. (ملاحظة: الكائن الذي تم الحصول عليه من خلال GetValue لم يعد نوعًا مرجعيًا)
العلاقة بين أنواع المراجع وهذا
يرتبط النوع المرجعي بشكل أساسي بهذه النقطة في سياق الوظيفة، ويبدو مختلفًا تمامًا في أوقات مختلفة، لذلك نقدم النوع المرجعي لشرح أداء هذا على وجه التحديد في سياق الوظيفة.
القواعد العامة لتحديد قيمة هذا في سياق الوظيفة هي كما يلي:
في سياق الدالة، يتم توفير ذلك بواسطة المتصل ويتم تحديده من خلال كيفية استدعاء الدالة. إذا كان الجانب الأيسر من قوس الاستدعاء () عبارة عن قيمة من النوع المرجعي، فسيتم تعيينها على الكائن الأساسي لقيمة النوع المرجعي. وفي حالات أخرى (أي خصائص أخرى مختلفة عن النوع المرجعي)، ستكون هذه القيمة فارغة . ومع ذلك، لا يوجد موقف فعلي تكون فيه قيمة this فارغة، لأنه عندما تكون قيمتها فارغة، سيتم تحويل قيمتها ضمنيًا إلى كائن عام. ملاحظة: في الإصدار الخامس من ECMAScript، لم يعد التحويل إلى المتغيرات العامة إجباريًا، ولكن تم تعيينه إلى غير محدد.
سنناقش أدناه ثلاث حالات بناءً على الاختلاف الموجود على الجانب الأيسر من قوس الاتصال:
(1) الجانب الأيسر من قوس الاستدعاء هو قيمة النوع المرجعي
هذا لا يتطلب الكثير من التحليل. الكائن الأساسي هو قيمة هذا. فقط ابحث عن القاعدة. إذا تم الإعلان عنه ضمن متغير عام، فإنه يشير إلى الكائن العمومي.
انسخ رمز الكود كما يلي:
فار ماي أوبجيكت = {
فو : وظيفة () {
console.log(this);
}
}
myObject.foo(); // ليس هناك شك في أن قاعدة foo هي myObject، لذلك يشير هذا في طريقة foo إلى myObject.
(2) الجانب الأيسر من قوس الاستدعاء هو قيمة نوع مرجعي، لكن هذه القيمة فارغة
انسخ رمز الكود كما يلي:
الدالة myFunction() {
فار فو = وظيفة(){
console.log(this);
}
foo(); //AO.foo() => null.foo();
}
myFunction(); // الإخراج: نافذة {أعلى: نافذة، نافذة: نافذة...}
عندما يتم استدعاء وظيفة داخلية، يجب أن يكون أساس الوظيفة الداخلية هو الكائن النشط (OA) في سياق التنفيذ الحالي، ومع ذلك، في JavaScript، عند استخدام OA كقاعدة، يتم التعامل معها على أنها فارغة السماح بأن يكون هذا فارغًا، ويتم تعيين كل القاعدة على الكائن العام (وهذا هو مصدر خطأ التصميم في نمط استدعاء هذه الوظيفة السابق). لذا، في هذه الحالة، يشير هذا إلى الكائن الشامل.
(3) قم باستدعاء القيمة الموجودة على الجانب الأيسر من القوس والتي لا تعد نوعًا مرجعيًا
انسخ رمز الكود كما يلي:
// مثال بسيط
(وظيفة () {
console.log(this); // null => global
})();
// مثال أكثر تعقيدًا
فار فو = {
شريط: وظيفة () {
console.log(this);
}
};
foo.bar(); // مرجع، OK => foo
(foo.bar)(); // المرجع، OK => foo
(foo.bar = foo.bar)();
(خطأ || foo.bar)();
(foo.bar, foo.bar)();
عندما لا يكون الجانب الأيسر من قوس الاستدعاء نوعًا مرجعيًا بل نوعًا آخر، فسيتم تعيينه تلقائيًا على قيمة فارغة وتكون النتيجة هي الكائن العام.
في المثال الأول، تحتوي الدالة المباشرة على تعبير على الجانب الأيسر من الدالة، استدعاء الأقواس، وليس مرجعًا.
المثال الثاني أكثر تعقيدًا، فلنحلله واحدًا تلو الآخر:
foo.bar()، ليس هناك شك في هذا، القاعدة هي foo، وهذا يشير إلى foo.
(foo.bar)()، يتم استخدام قوس هنا، والذي يعمل كرمز تجميع، أي أنه لا يفرض نوع المرجع على تنفيذ طريقة GetValue، وتكون نتيجة التنفيذ هي نفسها تمامًا كما هو مذكور أعلاه.
الثلاثة التالية، داخل الأقواس، هي عمليات التخصيص، أو العمليات وعمليات الفاصلة، جميعها تجبر النوع المرجعي على تنفيذ أسلوب GetValue، وبالتالي إرجاع كائن دالة. بهذه الطريقة، لم يعد الجانب الأيسر من أقواس استدعاء الوظيفة نوعًا مرجعيًا، لذلك يشير هذا إلى الكائن العام.
تلخيص
فيما يتعلق بأنواع المراجع، أنا في الواقع لا أعرف الكثير عن هذا، لقد رأيت هذا الفصل في مدونة العم توم لشرح مبدأ القيمة في وضع استدعاء الوظيفة لقد اعتقدت دائمًا أنه يجب أن تكون هناك علاقة ما بين أنواع المراجع والمرجع حسب القيمة، وبشكل غير متوقع، يتم استخدامه فقط في بولج للمساعدة في فهم ذلك. أما فيما يتعلق بما إذا كانت هناك علاقة بين الاثنين من قبل، وإذا كانت هناك علاقة ما نوع العلاقة، فلا زلت بحاجة إلى مواصلة الدراسة والبحث.
أتمنى أن تتمكن من التواصل أكثر. أود أن أشكر العم توم على هذا.