هل يستطيع أحد تفسير هذا سكريبت الأسلوب ؟
-
20-09-2019 - |
سؤال
المصدر الأصلي: http://twitter.com/tobeytailor/status/8998006366
(x=[].reverse)() === window // true
لقد لاحظت أن يؤثر هذا السلوك على كل مواطن الأنواع.بالضبط ما الذي يحدث هنا ؟
المحلول
هذا هو أن تفعل مع طريقة غريبة this
ملزمة يعمل في جافا سكريبت.
[].reverse
هو الأسلوب reverse
على قائمة فارغة.إذا كنت اسميها ، من خلال واحدة من:
[].reverse();
[]['reverse']();
([].reverse)();
ثم ينفذ مع this
لا بد أن القائمة سبيل المثال []
.ولكن إذا كنت سلخه:
x= [].reverse;
x();
فإنه ينفذ مع أي this
ملزمة, حتى this
في نقطة مهمة العالمية (window
) الكائن في واحدة من جافا سكريبت أسوأ معظم مضللة أخطاء التصميم.
(x=[].reverse)()
كما تفعل فصل.إحالة المشغل بإرجاع نفس وظيفة الكائن صدر لذا يبدو انها لا تفعل شيئا, ولكن لديها آثار جانبية من كسر محدودية الحالات الخاصة التي تسبب جافا سكريبت إلى ربط this
.
حتى أنت تقول:
Array.prototype.reverse.call(window)
reverse
, مثل غيرها من العديد من Array.prototype
طرق يحددها ECMAScript للعمل على أي مواطن تسلسل مثل الكائن.فإنه عكس العناصر عدد-سلسلة مفاتيح (تصل إلى object.length
) و إرجاع كائن.لذلك سوف يعود الكائن الذي تم تمريره في أي نوع له length
مكان الإقامة.
window
يبلغ طول المنشأة ، والتي تتطابق مع window.frames.length
, لذا استدعاء هذا الأسلوب مع this
لافتا في window
العمل والعودة window
.من الناحية النظرية قد لا تزال تفشل بسبب:
window
يسمح أن يكون "المضيف كائن" وليس "اللغة كائن";في هذه الحالة ضمانات حول ما يمكنك تمرير إلى أخرى نماذج من اساليب لا ينطبق بالضرورة;و- إذا كانت نافذة في الواقع إطارات/إطارات iframe, فإنه محاولة عكس النظام الذي لن ينجح لأن مجموعة إطار للقراءة فقط.
ومع ذلك ، في المتصفحات الحالية الحالة الأولى يعمل هذا الأخير فشل بصمت دون خطأ ، لذلك كنت لا تزال تحصل على ===window
السلوك وليس استثناء.