दिलचस्प पोस्ट
एकाधिक तर्कों के लिए पायथन मल्टीप्रोसेक्शन पूल.मैप मैं PyDev "आयात से अनिर्धारित चर" कैसे ठीक कर सकता हूं? कोई कनेक्शन नहीं किया जा सकता क्योंकि लक्ष्य मशीन ने इसे सक्रिय रूप से 127.0.0.1:3446 से इनकार कर दिया सूची दृश्य के माध्यम से डायनामिक रूप से जेनरेट किए गए चेकबॉक्स को चेक करते समय कोई समस्या हो रही है सी के रैंड () के लिए कौन सी आम एल्गोरिदम का उपयोग किया जाता है? प्रारूपित तिथि स्ट्रिंग के लिए यूनिक्स टाइमस्टैम्प परिवर्तित करना नया फ़ायरबेज क्लाउड मेसेजिंग सिस्टम के साथ अधिसूचना आइकन कैसे स्वयं को अस्वास्थ्ययोग्य पॉइंटर <Void> प्रकार में तेजी से डाली जाए CodeIgniter स्वतः एसक्यूएल इंजेक्शन रोकता है? मैं गीट प्रबंधित परियोजना में सभी स्थानीय परिवर्तनों को पिछले स्थिति में कैसे वापस कर सकता हूं? \ N से छुटकारा पा रहा है जब .readlines () jQuery जोड़ वर्ग। सक्रिय पर मेनू इंटरफ़ेस बिल्डर के साथ बनाई गई किसी निब फ़ाइल का उपयोग करके UIView को कैसे लोड करें विंडोज फॉर्म कंट्रोल से नाम से नियंत्रण ढूंढें एक "हैलो वर्ल्ड" वेबसॉकेट उदाहरण बनाना

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

मेरे पास एक जावास्क्रिप्ट फ़ाइल है जो की 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