جافا سكريبت - تحقق مما إذا كان في السياق العالمي

StackOverflow https://stackoverflow.com/questions/383185

  •  23-08-2019
  •  | 
  •  

سؤال

عندما يتم إرفاق الوظيفة بجائش وتسمى:

function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20

this يشير إلى الكائن الذي تم استدعاء الوظيفة كطريقة. ما يعادل القيام به f.call(o).

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

globalobj = this;
function f() { if (this == globalobj) doSomething(); }

ملاحظة: ليس لدي أي حالة واستخدام معين في الاعتبار هنا - أنا في الواقع أسأل عن هذه الآلية الدقيقة.

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

المحلول

الكائن العالمي هو في الواقع النافذة حتى تتمكن من القيام به

if (this === window)

نصائح أخرى

يجب أن يعمل أدناه منذ استخدام الوظيفة. باستخدام قيمة NULL ستحصل عليه في النطاق العالمي.

this === ((function () { return this; }).call(null))

متغير أبسط،

this === (function () { return this; })()

سوف تعمل أيضا، لكنني أعتقد أن الأول يجعل النية أكثر وضوحا.

إجابة Roborg صحيحة من الناحية النظرية - باستثناء window متوفر فقط في سياق مؤشر الترابط الرئيسي للمتصفحات (بحيث يستبعد هذا بالضرورة خيوط العمال وما شابه ذلك، بالإضافة إلى أي متصفح مستضاف JS، والذي يحصل على أقل وأقل غير شائع).

لديك الرهان الأكثر أمانا هو أساسا ما لديك أعلاه، ولكن يجب عليك استخدام var و === لأنه من الممكن بالنسبة لمترجم الترجمة لتحسين مثل هذه الوصول تماما.

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