यह पता लगाने की कोशिश करने में समस्या कि आपका कोड किस वातावरण में चल रहा है, किसी भी वस्तु को संशोधित किया जा सकता है और यह घोषित करना असंभव बना दिया जाता है कि कौन सी वस्तुएं पर्यावरण की मूल निवासी हैं, और जिन्हें कार्यक्रम द्वारा संशोधित किया गया है।
हालाँकि, कुछ तरकीबें हैं जिनसे हम यह पता लगा सकते हैं कि आप किस माहौल में हैं।
अंडरस्कोर लाइब्रेरी में आमतौर पर स्वीकृत समाधान के साथ शुरुआत करते हैं:
typeof module !== 'undefined' && module.exports
यह तकनीक सर्वर साइड के लिए वास्तव में पूरी तरह से ठीक है, क्योंकि जब requireफ़ंक्शन को कॉल किया जाता है, तो यह thisऑब्जेक्ट को एक खाली ऑब्जेक्ट पर रीसेट करता है , और moduleआपके लिए फिर से परिभाषित करता है , जिसका अर्थ है कि आपको किसी भी बाहरी छेड़छाड़ के बारे में चिंता करने की आवश्यकता नहीं है। जब तक आपका कोड अंदर लोड हो जाता हैrequire , तब तक आप सुरक्षित हैं।
हालांकि, यह ब्राउज़र पर अलग हो जाता है, क्योंकि कोई भी आसानी से परिभाषित moduleकर सकता है ऐसा लगता है कि यह वह वस्तु है जिसे आप खोज रहे हैं। एक तरफ यह वह व्यवहार हो सकता है जिसे आप चाहते हैं, लेकिन यह यह भी तय करता है कि वैश्विक दायरे में लाइब्रेरी उपयोगकर्ता किस चर का उपयोग कर सकता है। हो सकता है कि कोई उस नाम के साथ एक चर का उपयोग करना चाहता है moduleजो उसके exportsअंदर एक और उपयोग के लिए है। यह संभावना नहीं है, लेकिन हम कौन हैं जो किसी और का उपयोग करने वाले चर का न्याय कर सकते हैं, सिर्फ इसलिए कि दूसरा पर्यावरण उस चर नाम का उपयोग करता है?
हालाँकि, चाल यह है कि यदि हम मान रहे हैं कि आपकी स्क्रिप्ट वैश्विक दायरे में लोड की जा रही है (जो कि अगर यह स्क्रिप्ट टैग के माध्यम से भरी हुई है तो) एक चर को बाहरी बंद में आरक्षित नहीं किया जा सकता है, क्योंकि ब्राउज़र इसकी अनुमति नहीं देता है । अब नोड में याद रखें, thisऑब्जेक्ट एक खाली ऑब्जेक्ट है, फिर भी, moduleचर अभी भी उपलब्ध है। ऐसा इसलिए है क्योंकि यह एक बाहरी बंद में घोषित किया गया है। तो हम एक अतिरिक्त चेक जोड़कर अंडरस्कोर की जांच को ठीक कर सकते हैं:
this.module !== module
इसके साथ, यदि कोई moduleब्राउज़र में वैश्विक दायरे में घोषित करता है, तो उसे thisऑब्जेक्ट में रखा जाएगा, जिससे परीक्षण विफल this.moduleहो जाएगा , क्योंकि , मॉड्यूल के समान ऑब्जेक्ट होगा। नोड पर, this.moduleमौजूद नहीं है, और moduleएक बाहरी बंद के भीतर मौजूद है, इसलिए परीक्षण सफल होगा, क्योंकि वे समकक्ष नहीं हैं।
इस प्रकार, अंतिम परीक्षा है:
typeof module !== 'undefined' && this.module !== module
नोट: जबकि यह अब moduleवैरिएबल को वैश्विक दायरे में स्वतंत्र रूप से उपयोग करने की अनुमति देता है , फिर भी ब्राउज़र में इसे बंद करना संभव है एक नया क्लोजर बनाकर और moduleउसके भीतर घोषणा करके , फिर उस क्लोजर के भीतर स्क्रिप्ट लोड करना। उस बिंदु पर उपयोगकर्ता नोड वातावरण की पूरी तरह से नकल कर रहा है और उम्मीद है कि जानता है कि वे क्या कर रहे हैं और एक नोड शैली की आवश्यकता करने की कोशिश कर रहे हैं। यदि कोड को स्क्रिप्ट टैग में कहा जाता है, तो यह अभी भी किसी भी नए बाहरी क्लोजर से सुरक्षित रहेगा।