يجب إنشاء متغير اسمه _ هذا الصراع مع هذا?
-
13-12-2019 - |
سؤال
هذا مثال مفتعل للغاية ، لكن لنفترض أننا أنشأنا متغيرا _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
لتسهيل الإغلاق الذي سيتم إنشاؤه باستخدام بناء جملة لامدا.أنا متأكد من أنني قرأت هذا في مواصفات الكتابة المطبوعة في مكان ما ، لكنني أوافق على أن المترجم يجب أن يصدر خطأ في هذه الحالة.
أنا لا أحب فكرة مترجم متفاوتة كيف تنبعث جافا سكريبت لأن هذا يتعارض مع الهدف المعلن لتوليد "الاصطلاحية" (وبالتالي يمكن التنبؤ بها) جافا سكريبت.
نصائح أخرى
أليس ما يمكن أن نسميه متغير المحجوزة?أعتقد أنك لن تعلن عن متغير يسمى "هذا" أو "المستند" أيضا.
طالما مس هو واضح على ما هي المتغيرات المحجوزة ، وأنا لا أعتقد أن هناك مشكلة كبيرة.ربما يمكنهم تحسين المترجم لإخراج التحذيرات بالرغم من ذلك.