الحصول على مرجع للكائن العمومي في بيئة غير معروفة في الوضع الصارم

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

سؤال

ما هي الطريقة الموصى بها للحصول على مقبض ل كائن عالمي في الوضع الصارم ES5 في بيئة مضيفة غير معروفة?

لا يوفر ECMAScript طريقة مضمنة للإشارة إلى الكائن العام الذي أعرفه.إذا كان الأمر كذلك، فهذا هو الجواب الذي أبحث عنه.

في بيئة معروفة, ، عادةً ما يكون للكائن العام خاصية مرجعية ذاتية.نظرًا لأن الكائن العالمي هو تعليق صوتي بالنسبة للنطاق العام، تعد خصائص الكائن العمومي متغيرات عامة، لذا يمكننا استخدامها للحصول على مؤشر للكائن العمومي من أي مكان:

  • في متصفح الويب، يمكننا استخدام window أو self.

  • في Node.js، يمكننا استخدام global.

ومع ذلك، ليس هذا هو الحال بالضرورة في كافة البيئات المضيفة.بقدر ما أعرف، لا يوفر Windows Script Host أي طريقة للوصول إلى الكائن العام.يبدو أن الطريقة الموصى بها للحصول على الكائن العمومي في WSH هي استخدام ملف this الكلمة الأساسية في سياق حيث لا يتم حلها لكائن.على سبيل المثال:

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

ستعمل هذه التقنية مع أي بيئة مضيفة، ولكن ليس في الوضع الصارم، نظرًا لأن الأمر غير محدد this لا يشير إلى الكائن العمومي في الوضع الصارم:

إذا تم تقييم ذلك ضمن رمز الوضع الصارم، فلن يتم فرض هذه القيمة على كائن. لا يتم تحويل هذه القيمة الخالية أو غير المحددة إلى الكائن العمومي ولا يتم تحويل القيم الأولية إلى كائنات مجمعة.لا تُجبر هذه القيمة التي تم تمريرها عبر استدعاء دالة (بما في ذلك الاستدعاءات التي تم إجراؤها باستخدام Function.prototype.apply وFunction.prototype.call) على تمرير هذه القيمة إلى كائن (10.4.3، 11.1.1، 15.3.4.3، 15.3. 4.4).

كما هو متوقع، ينتج عن التعليمة البرمجية التالية undefined:

(function(){
    "use strict";
    var GLOBAL = (function(){return this}());
    console.log(GLOBAL);
}());

إذن ما هي الطريقة الصحيحة لذلك الحصول على مؤشر للكائن العمومي في أي بيئة، بغض النظر عن الوضع الصارم?

بالمناسبة، أسلوبي الحالي هو البحث عن المتغيرات العامة التي تشير إلى الكائن العام مثل هذا:

var self, window, global = global || window || self;

...ثم استخدم فقط global.أعتقد أن هذا حل سيئ لعدد من الأسباب، معظمها واضح إلى حد ما، ولا يعالج مشكلة WSH.

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

المحلول

في ES5، يمكنك الحصول على مرجع للكائن العام من داخل الوضع الصارم عبر استدعاء التقييم غير المباشر:

"use strict";
var global = (1,eval)('this');

نلقي نظرة على مقالتي;خاصة في هذا قسم على الوضع الصارم.

نصائح أخرى

في الكود العالمي, ، ال thisBinding تم تعيينه على الكائن العام بغض النظر عن الوضع الصارم.وهذا يعني أنه يمكنك تمريره من هناك إلى الوحدة النمطية الخاصة بك IEFE:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

في الوضع الصارم، طريقة الحصول على مرجع للكائن العمومي هي تعيين متغير في الكائن العام الذي يشير إلى نفسه.

إنه this يعني الكائن العالمي عندما يكون في السياق العالمي, ، فالحل ببساطة هو:

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

هذا يفعل يعني أنه يتعين عليك تلويث مساحة الاسم العالمية بالإشارة إلى نفسها، ولكن كما تقول، كان ينبغي أن تكون موجودة بالفعل.

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