दिलचस्प पोस्ट
क्लाइंट आईपी पता jQuery का उपयोग कैसे करें Html.TextBoxFor के लिए शर्त पर आधारित विशेषता को अक्षम करें कैसे एक निरर्थक संदर्भ पर एक (स्थैतिक) विधि लागू करने NullPointerException फेंक नहीं करता है? एक से कई रिश्ते के साथ इकाई फ़्रेमवर्क ऑब्जेक्ट के सीरियललाइज़ेशन एक्सेस-कंट्रोल-अनुमति-मूल सेट करने की सुरक्षा जोखिम क्या हैं? कम्प्यूटिंग कैमरे 4 समांतर अंकों के आधार पर समरूपता मैट्रिक्स के साथ प्रस्तुत करता है जावास्क्रिप्ट में IE संस्करण (v9 से पहले) का पता लगाएं ResultSet.getString (1) java.sql फेंकता है। QLException: वर्तमान कर्सर स्थिति में अमान्य ऑपरेशन जावा में दिनांक की तुलना कैसे करें? SASS का उपयोग करते समय मैं एक अलग निर्देशिका से एक फ़ाइल कैसे आयात कर सकता हूं? स्ट्रॉप्स केस कैसे असंवेदनशील बनाने के लिए स्प्रिंग एमवीसी में स्थिर सामग्री को कैसे संभालना है? mysql – बोली संख्याएं या नहीं? असाइनमेंट ऑपरेटर को ओवरलोड करने के लिए गैर सदस्यीय फ़ंक्शन का उपयोग क्यों नहीं किया जा सकता? Jquery में तत्व का अनूठा चयनकर्ता प्राप्त करें

नोड.जेएस मॉड्यूल और फ़ंक्शन में "यह" का अर्थ

मेरे पास एक जावास्क्रिप्ट फ़ाइल है जो की require

 // loaded by require() var a = this; // "this" is an empty object this.anObject = {name:"An object"}; var aFunction = function() { var innerThis = this; // "this" is node global object }; aFunction(); (function(anyParameter){ console.log(anyParameter.anObject); })( this // "this" is same having anObject. Not "global" ); 

मेरा सवाल है: this a = this; var a = this; एक रिक्त ऑब्जेक्ट है जबकि फ़ंक्शन में this स्टेटमेंट्स नोड। जेएस ग्लोबल ऑब्जेक्ट की छाया हैं। मुझे पता है कि this कीवर्ड फ़ंक्शन में अलग है, लेकिन मुझे समझ में नहीं आ रहा था कि this क्यों पहले वैश्विक के बराबर नहीं है और this फ़ंक्शन में वैश्विक रूप से बराबर है

फंक्शन स्कोप में नोड। जेएस this global से कैसे इंजेक्ट करते हैं, और यह मॉड्यूल गुंजाइश को क्यों नहीं लेता है?

वेब के समाधान से एकत्रित समाधान "नोड.जेएस मॉड्यूल और फ़ंक्शन में "यह" का अर्थ"

इस स्थिति को स्पष्ट करने के लिए आपको कुछ मौलिक तथ्यों को समझना चाहिए:

  • नोड मॉड्यूल में शीर्ष-स्तरीय कोड में, this मॉड्यूल के बराबर है। module.exports वह खाली वस्तु है जो आप देखते हैं।

  • जब आप फ़ंक्शन के अंदर this उपयोग करते हैं, तो this का मान फ़ंक्शन के प्रत्येक निष्पादन से पहले नए सिरे से निर्धारित किया जाता है, और इसका मान फ़ंक्शन निष्पादित होने के द्वारा निर्धारित किया जाता है । इसका मतलब यह है कि सटीक एक ही फ़ंक्शन ऑब्जेक्ट के दो इनवॉक्शन्स this वैल्यू को अलग कर सकते हैं यदि इनवोकेशन मैकेनिज्म अलग-अलग हो (जैसे emitter.addEventListener("someEvent", aFunction); aFunction.call(newThis) बनाम। emitter.addEventListener("someEvent", aFunction);emitter.addEventListener("someEvent", aFunction); aFunction.call(newThis) बनाम emitter.addEventListener("someEvent", aFunction); आदि ।) आपके मामले में, गैर-सख्त मोड में फंक्शन aFunction() फ़ंक्शन this सेट के साथ वैश्विक ऑब्जेक्ट को चलाता है।

  • जब जावास्क्रिप्ट फ़ाइलों को नोड मॉड्यूल की require , तो नोड इंजन एक आवरण समारोह के अंदर मॉड्यूल कोड चलाता है। मॉड्यूल-रैपिंग फंक्शन को this सेट के साथ मॉड्यूल में डाल दिया module.exportsmodule.exports (ऊपर से याद करो, किसी फ़ंक्शन को this मान के विपरीत चलाया जा सकता है।)

इस प्रकार, आप this मूल्यों को अलग this हैं क्योंकि प्रत्येक this एक अलग फ़ंक्शन के अंदर रहता है: पहला नोड से निर्मित मॉड्यूल-आवरण समारोह के अंदर है और दूसरा फ़ंक्शन के अंदर है।

इसे समझने के लिए, आपको यह समझना होगा कि Node.js वास्तव में आपके मॉड्यूल कोड को एक फ़ंक्शन में लपेटता है, जैसे यह

 (function (exports, require, module, __filename, __dirname) { var test = function(){ console.log('From test: ' + this); }; console.log(this); test(); }); 

इस उत्तर में विस्तृत विवरण प्राप्त किया जा सकता है।


अब, इस लिपटे फ़ंक्शन को वास्तव में इस तरह लागू किया जाता है

 var args = [self.exports, require, self, filename, dirname]; return compiledWrapper.apply(self.exports, args); 

इसलिए, this , मॉड्यूल स्तर पर, वास्तव में exports ऑब्जेक्ट है।

आप इस तरह की पुष्टि कर सकते हैं

 console.log(this, this === module.exports); // {} true 

यह इसलिए है क्योंकि नोड। जेएस मॉड्यूल में डिफ़ॉल्ट वैश्विक ऑब्जेक्ट exports ऑब्जेक्ट है, और आप test() को बुला रहे हैं जो यह निर्दिष्ट नहीं करता है। पारंपरिक जेएस में, this वैश्विक वस्तु को इंगित करता है, use strict साथ, this शून्य हो जाएगा।

this कुछ भी इंगित कर सकता है, यह सिर्फ यह निर्भर करता है कि आप इसे कैसे कहते हैं

  • test() : इस तरह वैश्विक ऑब्जेक्ट ( exports ) का उपयोग करता है, जब तक कठोर मोड में नहीं, जहां this रिक्त हो।
  • test.call({}) या test.apply({}) : आप यह निर्दिष्ट कर रहे हैं कि this (प्रथम पैरामीटर)
  • var obj = {testRef: test}; obj.testRef() var obj = {testRef: test}; obj.testRef() : this बाईं ओर सेट है , वह है, obj

द फॉरर्थेय का उत्तर मुकाबला करना

यह सच है कि this मॉड्यूल के शीर्ष स्तर में exports , लेकिन इसका जरूरी मतलब यह नहीं है कि this अंदर test() भी एक ही बात को इंगित करेगा, जहां से इसे बुलाया गया था


this साबित करने का प्रयास करते हुए कि this और वैश्विक वस्तु दोनों exports करने के लिए इंगित करती हैं

  myGLobal = 5; this.myGlobal; // 5