جافا سكريبت - تحقق مما إذا كان في السياق العالمي
-
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
و ===
لأنه من الممكن بالنسبة لمترجم الترجمة لتحسين مثل هذه الوصول تماما.