ما هو الاسم الأفضل لـ "هذا" في Javascript؟
-
05-07-2019 - |
سؤال
أنا قادم من خلفية جافا، مع نموذج الوراثة القائم على الفصل، وأحاول أن أتعرف على نموذج الوراثة القائم على النموذج الأولي لجافا سكريبت.أعتقد أن جزءًا مما يزعجني هو أنني أضع معنى "هذا" في Java في ذهني بقوة - و"هذا" في Javascript هو وحش مختلف تمامًا.أدرك أن كلمة "هذا" في Javascript تشير دائمًا إلى المتصل بالوظيفة، وليس النطاق الذي تم تعريف الوظيفة فيه - أعني أنني قرأت ذلك وفهمت بشكل سطحي ما يعنيه.لكني أرغب في الحصول على فهم أعمق، وأعتقد أن وجود اسم آخر له سيكون مفيدًا.ما رأيك في JS "هذا"؟هل تقوم باستبدال عقلي في كل مرة تصادفها؟إذا كان الأمر كذلك - ما هي الكلمة أو العبارة التي تستخدمها؟
المحلول
this
قد تتم إعادة تسميتها بشكل معقول context
في JavaScript.
إنه يشير حقًا إلى سياق التنفيذ للنطاق الحالي ، وفي حين أن هذا السياق يستطيع كن مثالًا على الفصل ، فمن المؤكد أنه لا يجب أن يكون-يمكن أن يكون أي كائن على الإطلاق ، ويمكن تعديله في وقت التشغيل.
دليل على أنه لا يوجد ضمان على الإطلاق على أن "الطريقة" في جافا سكريبت تعمل على مثيل "الفصل" الذي يتم تعريفه فيه:
function Cat(){
this.texture = 'fluffy';
this.greet = function(){
alert("Pet me, I'm " + this.texture);
}
}
var cat = new Cat();
// Default to using the cat instance as the this pointer
cat.greet(); // Alerts "Pet me, I'm fluffy"
// Manually set the value of the this pointer!
cat.greet.call({texture: 'scaly'}); // Alerts "Pet me, I'm scaly"
من المهم أن نلاحظ ذلك قيمة this
الكائن مستقل تمامًا عن المكان الذي يتم فيه تحديد وظيفة الاحتواء.
نصائح أخرى
أحد الأسماء البديلة المحتملة سيكون owner
.سيؤدي هذا إلى توجيه عقلك في الاتجاه الذي يمكن للمالك تغييره اعتمادًا على الكود الذي تقوم بتنفيذه.
هذا المثال من وضع المراوغات:
في جافا سكريبت this
يشير دائمًا إلى "مالك" الوظيفة التي نقوم بتنفيذها، أو بالأحرى، إلى الكائن الذي تكون الوظيفة وسيلة له.عندما نحدد وظيفتنا المخلصة doSomething() في الصفحة، فإن مالكها هو الصفحة، أو بالأحرى، كائن النافذة (أو الكائن العام) في JavaScript.ومع ذلك، فإن خاصية onclick مملوكة لعنصر HTML الذي تنتمي إليه.
في الكود التالي،
function doSomething() {
this.style.color = '#cc0000';
}
و
element.onclick = doSomething;
, owner
يشير إلى الكائن الذي يحتوي على الطريقة عند تنفيذها.
------------ window --------------------------------------
| / \ |
| | |
| this |
| ---------------- | |
| | HTML element | <-- this ----------------- |
| ---------------- | | doSomething() | |
| | | ----------------- |
| -------------------- |
| | onclick property | |
| -------------------- |
| |
----------------------------------------------------------
أعتقد أن JavaScript this
هو أقرب بكثير من جافا this
مما تعتقدون. في سياق OOP ، this
يعني "هذه الحالة". أعتقد أن ما قد يكون مربكًا بشأن JavaScript this
الكلمة الرئيسية هي ذلك يستطيع لها معنى مختلف اعتمادا على السياق.
this
ليس متصل الوظيفة (على الرغم من أنه قد يكون) أو النطاق الذي تم فيه تعريف الوظيفة (على الرغم من أنها قد تكون) - إنها الوظيفة سياق الكلام.
يعني التحول الذي يشير إلى أندرو هير إلى مصدر ارتباكك ؛ بسبب آلية ميراث النموذج الأولي ، function
يمكن أن تعني الكلمة الرئيسية ، اعتمادًا على كيفية استخدامها ، شيء أقرب إلى Java class
من تعريف طريقة جافا.
بافتراض التنفيذ في المتصفح:
var q = this.document; //this is window
var o = new (function pseudoconstructor(){
this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return'
})();
ماذا عن "JavaScript هذا"؟ من شأنه أن يبقيك مرتبطًا مباشرة بما تفعله ، كما أنه يوفر تذكيرًا عقليًا بأن مفهوم "هذا" الذي تعمل معه حاليًا هو مفهوم JavaScript.
في النهاية ، أتوقع أن تتوقف عن تسميته "JavaScript هذا" وتسميه فقط "هذا" ، وأن تكون على دراية تامة بما يعنيه ذلك في السياق الذي تعمل فيه. وهو ما أتوقعه هو المكان الذي تريده على الأرجح للوصول إلى ، على أي حال.
أنا امتص بناء جملة جديدة مع نماذج عقلية سهلة من النوع مثل:
$(document).ready(function() {
function baffle() {
alert(this.b);
}
function what() {
this.b = "Hello";
baffle();
}
function huh() {
this.b = "World";
baffle();
}
what();
huh();
}
);
هذا ينقل بشكل سيء إلى C ++ وهمي قذرة.
template <class This>
function baffle() {
alert(This.b);
}
function what() {
b = "Hello";
baffle<what>();
}
function huh() {
b = "World";
baffle<huh>();
}
what();
huh();
أظن this
هو الأنسب لأسباب تاريخية. لا توجد حقًا عبارة واحدة تناسب الجميع this
في JavaScript ، لأنه لا يمكن تعيينه تلقائيًا إلى مراجع مختلفة جدًا ، على سبيل المثال ، this
في سياق وظيفة إجرائية أو this
في سياق كائن ، ولكن this
يمكن أيضًا تعيينه بواسطة Scripter باستخدام Function.apply
و Function.call
.
ومع ذلك ، معنى this
يمكن تعديله فقط لأن JavaScript و DOM يعملان في بعض الطرق الغريبة للغاية. على سبيل المثال ، الاستخدام الأساسي لـ Function.apply
هو الحفاظ على سياق مرجع عنصر في مكالمات الأحداث. سترى هذا في Prototye's Function.bind()
طريقة.
this
هو عنصر نائب للسياق الذي يتم فيه تنفيذ الوظيفة ، ومن الصعب الحصول على أي وقت محدد من ذلك. ومع ذلك ، فإن معظم استخدامات this
اجعلها كلمة رئيسية مناسبة بشكل دلالي. في حالة ما اذا bind()
, ، على الرغم من أننا نستخدم طرقًا لتغيير معنى this
ضمن الوظيفة ، يجب استخدامه للعمل this
أكثر ملاءمة مما سيكون بدونه. يتم طرح العديد من مبرمجي JavaScript للهواة من خلال السلوك الغريب لـ this
في معالجات الأحداث ، و Function.apply
يستخدم لتصحيح أن "الخطأ".
المنطق الذاتي (الذات أو هذا) يتجنب المفارقات للاستفادة من العمل بخلاف الذات (هذا). يجب أن تحافظ على كل شيء (هذا) كل شيء إلى واحد ، فقد يظل ثابتًا أيضًا بدون مثيل ومع طريقة الفصل (ثابت) بدلاً من ذلك. لتجنب المفارقات ، تجنب العزفات الذاتية والمنطق يبقي جميع الحقائق قابلة للإثبات و Viceversa ، وكلها تثير.