سؤال

المصدر الأصلي: 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.من الناحية النظرية قد لا تزال تفشل بسبب:

  1. window يسمح أن يكون "المضيف كائن" وليس "اللغة كائن";في هذه الحالة ضمانات حول ما يمكنك تمرير إلى أخرى نماذج من اساليب لا ينطبق بالضرورة;و
  2. إذا كانت نافذة في الواقع إطارات/إطارات iframe, فإنه محاولة عكس النظام الذي لن ينجح لأن مجموعة إطار للقراءة فقط.

ومع ذلك ، في المتصفحات الحالية الحالة الأولى يعمل هذا الأخير فشل بصمت دون خطأ ، لذلك كنت لا تزال تحصل على ===window السلوك وليس استثناء.

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