سؤال

أنا قادم من خلفية جافا، مع نموذج الوراثة القائم على الفصل، وأحاول أن أتعرف على نموذج الوراثة القائم على النموذج الأولي لجافا سكريبت.أعتقد أن جزءًا مما يزعجني هو أنني أضع معنى "هذا" في 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 ، وكلها تثير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top