javascript सख्त मोड में अज्ञात वातावरण में वैश्विक वस्तु का संदर्भ प्राप्त करना




global ecmascript-5 (3)

एक अज्ञात होस्ट वातावरण में ES5 सख्त मोड में वैश्विक ऑब्जेक्ट को हैंडल प्राप्त करने का अनुशंसित तरीका क्या है?

ईसीएमएस्क्रिप्ट वैश्विक वस्तु का संदर्भ देने के लिए एक अंतर्निहित तरीका प्रदान नहीं करता है जिसे मैं जानता हूं। अगर ऐसा होता है, तो यह वह जवाब है जिसे मैं ढूंढ रहा हूं।

एक ज्ञात वातावरण में , वैश्विक वस्तु में आमतौर पर एक आत्म-संदर्भित संपत्ति होती है। चूंकि वैश्विक वस्तु वैश्विक दायरे के लिए VO , वैश्विक वस्तु के गुण वैश्विक चर हैं, इसलिए हम उन्हें वैश्विक वस्तु से कहीं भी हैंडल प्राप्त कर सकते हैं:

  • एक वेब ब्राउज़र में, हम window या self उपयोग कर सकते हैं।

  • Node.js में, हम global उपयोग कर सकते हैं।

हालांकि, यह सभी मेजबान वातावरण में जरूरी नहीं है। जहां तक ​​मुझे पता है, विंडोज स्क्रिप्ट होस्ट वैश्विक वस्तु तक पहुंचने का कोई तरीका नहीं प्रदान करता है। ऐसा लगता है कि डब्लूएसएच में वैश्विक वस्तु प्राप्त करने का अनुशंसित तरीका 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 उपयोग करें। मुझे लगता है कि यह कई कारणों से एक बुरा समाधान है, जिनमें से अधिकांश काफी स्पष्ट हैं, और यह डब्ल्यूएसएच समस्या का समाधान नहीं करता है।


सख्त मोड में, वैश्विक ऑब्जेक्ट का संदर्भ प्राप्त करने का तरीका वैश्विक ऑब्जेक्ट में खुद को संदर्भित करने वाला चर निर्दिष्ट करना है।

इसका मतलब वैश्विक संदर्भ में वैश्विक वस्तु है , इसलिए समाधान बस है:

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

इसका मतलब यह है कि आपको अपने संदर्भ के साथ वैश्विक नामस्थान को प्रदूषित करना होगा, लेकिन जैसा कि आप कहते हैं, यह पहले से ही वहां होना चाहिए था।


वैश्विक कोड में , सख्त मोड के बावजूद यह thisBinding वैश्विक वस्तु पर सेट है। इसका मतलब है कि आप इसे अपने मॉड्यूल आईईएफई में से पास कर सकते हैं:

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

ईएस 5 में, आप अप्रत्यक्ष eval कॉल के माध्यम से सख्त मोड के भीतर से वैश्विक वस्तु का संदर्भ प्राप्त कर सकते हैं:

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

मेरे लेख पर एक नज़र डालें; विशेष रूप से सख्त मोड पर इस खंड में





strict-mode