سؤال

هذا مثال مفتعل للغاية ، لكن لنفترض أننا أنشأنا متغيرا _this في مكان ما في وظيفة الصف.

class Person {
  constructor (public name : string) {}
  changeName(name) {
    var _this = {};
    (() => {
      this.name = name;
    })();
  }
}

هذا لن يعمل كما هو متوقع عندما نسمي changeName وظيفة لأن الجزء ذي الصلة من التعليمات البرمجية المترجمة يشبه هذا:

var _this = this;
var _this = {};
(function () {
  _this.name = name;
})();

هذا هو جافا سكريبت سيئة:لدينا اثنين var الإعلانات الكتابة فوق بعضها البعض.ال _this التي تم إنشاؤها بواسطة مترجم يتم الكتابة من قبل بلدي _this.

بقدر ما أستطيع أن أرى ، لم يتم تحديد هذا السلوك في المواصفات تيبسكريبت.

لماذا يجب أن الصراع?لا يمكن للمترجم اكتشاف ما إذا كنت قد أنشأت متغيرا اسمه _this واسم ولدت تلقائيا شيء واحد آخر ، مثل _this2 للحفاظ على المتغيرات الخاصة بي والمتغيرات التي تم إنشاؤها بواسطة المترجم من الدوس على بعضها البعض?

هل كانت مفيدة؟

المحلول

سيقوم المترجم تلقائيا بإنشاء _this كمرجع إلى this لتسهيل الإغلاق الذي سيتم إنشاؤه باستخدام بناء جملة لامدا.أنا متأكد من أنني قرأت هذا في مواصفات الكتابة المطبوعة في مكان ما ، لكنني أوافق على أن المترجم يجب أن يصدر خطأ في هذه الحالة.

أنا لا أحب فكرة مترجم متفاوتة كيف تنبعث جافا سكريبت لأن هذا يتعارض مع الهدف المعلن لتوليد "الاصطلاحية" (وبالتالي يمكن التنبؤ بها) جافا سكريبت.

نصائح أخرى

أليس ما يمكن أن نسميه متغير المحجوزة?أعتقد أنك لن تعلن عن متغير يسمى "هذا" أو "المستند" أيضا.

طالما مس هو واضح على ما هي المتغيرات المحجوزة ، وأنا لا أعتقد أن هناك مشكلة كبيرة.ربما يمكنهم تحسين المترجم لإخراج التحذيرات بالرغم من ذلك.

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