दिलचस्प पोस्ट
कमांड लाइन से "बिल्ड और आर्काइव" Xcode एसक्यूएल रैंक () बनाम ROW_NUMBER () अपाचे वर्चुअलहोस्ट 403 निषिद्ध फेसबुक ग्राफ़ एपीआई v2.0 + – / मी / दोस्त खाली, या केवल मेरे आवेदन का उपयोग करने वाले दोस्त हैं में मैं isset () और रिक्त (रिक्त) का उपयोग कैसे करूँगा? Filezilla और SFTP का उपयोग करते हुए अमेज़ॅन EC2 फ़ाइल निर्देशिका से कनेक्ट करें MySQLdb का उपयोग कर "SELECT … WHERE … IN …" निष्पादित कर रहा है सी 8 9 मानक के साथ एमओपीआई का उपयोग करना अस्थायी-बिंदु संख्याओं में सटीकता की समस्याओं से निपटना वर्तमान HTTPContext में एक नया asp.NET सत्र उत्पन्न करना `Data.table` के भीतर` j` अभिव्यक्ति के भीतर दोनों स्तंभ नाम और लक्ष्य मान का मूल्यांकन करना एंकर टैग के अंदर एंकर टैग बनाना सी ++ में स्थान से अलग किए गए फ़्लोट्स को कैसे पर्स करना है? प्रतिवर्ती छद्म यादृच्छिक अनुक्रम जनरेटर वास्तव में कैसे __ वितरित करता है __ ((कन्स्ट्रक्टर)) काम करता है?

जावास्क्रिप्ट बाइंड क्यों आवश्यक है?

उदाहरण 1 में समस्या 'this' को myName ऑब्जेक्ट के बजाय वैश्विक नाम का संदर्भ देता है।

मैं बाइंड () का उपयोग किसी विशेष ऑब्जेक्ट के मान को सेट करने में समझता हूं, इसलिए यह समस्या 1 में समस्या को हल करता है, लेकिन यह समस्या पहली जगह में क्यों होती है? क्या यह सिर्फ जावास्क्रिप्ट बनाया गया था?

मैं भी सोच रहा हूं कि उदाहरण 3 में समस्या का हल और उदाहरण 2 और 3 के बीच का अंतर

this.name = "John" var myName = { name: "Tom", getName: function() { return this.name } } var storeMyName = myName.getName; // example 1 var storeMyName2 = myName.getName.bind(myName); // example 2 var storeMyName3 = myName.getName(); // example 3 console.log("example 1: " + storeMyName()); // doesn't work console.log("example 2: " + storeMyName2()); // works console.log("example 3: " + storeMyName3); // works 

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट बाइंड क्यों आवश्यक है?"

जावास्क्रिप्ट बाइंड क्यों आवश्यक है?

इसका मान निर्धारित किया जाता है कि फ़ंक्शन को कैसे कहा जाता है । यदि आप ऐसा हैं जो फ़ंक्शन कॉल करता है तो आमतौर पर उपयोग करने की कोई आवश्यकता नहीं है .bind , क्योंकि फ़ंक्शन को कॉल करने के लिए आपके पास नियंत्रण है, और इसलिए इसका this मान।

हालांकि, अक्सर यह आप नहीं है जो समारोह कॉल करता है। कॉलबैक और इवेंट हैंडलर के रूप में फ़ंक्शन अन्य फ़ंक्शन को पारित कर दिए जाते हैं। उन्हें अन्य कोड कहा जाता है और फ़ंक्शन को कैसे कहा जाता है, इस पर आपको कोई नियंत्रण नहीं है, और इसलिए इसे नियंत्रित नहीं किया जा सकता कि this क्या उल्लेख होगा।

यदि आपके फ़ंक्शन को this एक विशिष्ट मान पर सेट करने की आवश्यकता है और आप फ़ंक्शन को कॉल करने वाले नहीं हैं, तो आपको फ़ंक्शन को this विशिष्ट मान को .bind

दूसरे शब्दों में: .bind आप फ़ंक्शन को कॉल किए बिना this का मूल्य सेट करने की अनुमति देता है।

यहां कॉलिंग फ़ंक्शन का संदर्भ देने की तुलना है:

  +-------------------+-------------------+ | | | | time of | time of | |function execution | this binding | | | | +-------------------+-------------------+-------------------+ | | | | | function object | future | future | | f | | | | | | | +-------------------+-------------------+-------------------+ | | | | | function call | now | now | | f() | | | | | | | +-------------------+-------------------+-------------------+ | | | | | f.call() | now | now | | f.apply() | | | | | | | +-------------------+-------------------+-------------------+ | | | | | f.bind() | future | now | | | | | +-------------------+-------------------+-------------------+ 

मैं भी सोच रहा हूं कि उदाहरण 3 में समस्या का हल और उदाहरण 2 और 3 के बीच का अंतर

उदाहरण 1/2 और 3 अधिक भिन्न नहीं हो सकते storeMyName और storeMyName2 में फ़ंक्शन होते हैं , जिसे भविष्य में कहा जाता है, जबकि storeMyName3 उस समय myName.getName() को कॉल करने का परिणाम होता है।


आगे की पठन सामग्री:

  • "यह" कीवर्ड कैसे काम करता है?
  • एमडीएन – यह
  • YDKS – इस और ऑब्जेक्ट प्रोटोटाइप
  • कॉलबैक के अंदर सही `इस` संदर्भ का उपयोग कैसे करें?

bind() पद्धति एक नया फ़ंक्शन बनाता है, जिसे बुलाया जाता है, के पास इस कीवर्ड को दिए गए मूल्य पर सेट किया जाता है, जो कि किसी नए फ़ंक्शन को कहा जाने पर प्रदान किए गए तर्कों के दिए गए अनुक्रम के साथ होता है।

इसलिए, जब आप var storeMyName = myName.getName; निष्पादित करते हैं var storeMyName = myName.getName; पहली बार, यह वैश्विक name लेता है (this.name = "John")

जब आप bind() फ़ंक्शन का उपयोग करते bind() , तो वह वर्तमान बंद करने वाले नाम (इस मामले में myName) का उल्लेख करना शुरू करता है और इसलिए Tom प्रिंट करता है

तीसरी बार, जब से फ़ंक्शन को तुरंत कहा जाता है, इसका दायरा अपने स्थानीय ऑब्जेक्ट के भीतर होता है और इस तरह से क्लोजर Tom

बाइंड एक ऐसा तंत्र है जिसके द्वारा आप संदर्भ को बदल सकते हैं (यहां आपका डिफ़ॉल्ट संदर्भ वैश्विक है) निष्पादन का है।

आपके उदाहरण के आधार पर –

 var storeMyName = myName.getName; 

उपरोक्त पंक्ति से आप वैश्विक संदर्भ में storeMyName फ़ंक्शन निष्पादित कर रहे हैं, इसलिए इस निष्पादन के लिए यह नाम शीर्ष पंक्ति (अर्थात वैश्विक एक / "जॉन") होगा।

 var storeMyName2 = myName.getName.bind(myName); 

उपरोक्त पंक्ति के लिए आप स्पष्ट रूप से storeMyName2 फ़ंक्शन के लिए निष्पादन के संदर्भ को बदल रहे हैं (यह कहकर कि मैं इस समारोह को वैश्विक फ़ंक्शन के रूप में निष्पादित नहीं करना चाहता हूँ, मैं इस फ़ंक्शन को myName ऑब्जेक्ट के संदर्भ में निष्पादित करना चाहता myName , इसलिए इस मामले में यह। "टॉम" होना)

 var storeMyName3 = myName.getName(); // example 3 

और इसके बाद के संस्करण के लिए आप केवल myName ऑब्जेक्ट प्रसंग पर फ़ंक्शन कार्यान्वित कर रहे हैं, इससे भी महत्वपूर्ण बात यह है कि आप storeMyName3 निष्पादित नहीं कर रहे हैं और इसलिए इसका संदर्भ वैश्विक नहीं है

एक समानता मुझे पसंद है, जिसे मैंने कभी भी नहीं देखा है: मान लें कि आपके पास bar फंक्शन के साथ एक फू ऑब्जेक्ट है। जब आप बार फ़ंक्शन को किसी अन्य चर में बाध्य कर रहे हैं (या इसे फ़ंक्शन पैरामीटर के रूप में देना है, जो कॉलबैक के साथ अधिक सामान्य मामला है), तो आप फ़ंक्शन को उसके संलग्न ऑब्जेक्ट के साथ नहीं, बल्कि "नग्न" इसलिए "नग्न" कार्य के साथ, this वैश्विक वस्तु का अर्थ है।

एक छोटा डेमो

 var foo = "global foo"; //foo set on the global object var a = {foo : "object foo", bar : function(){return this.foo;}}; var bound = a.bar; console.log(bound());//returns "global foo", not "object foo" 

bound बस function(){return this.foo;} को इंगित करें function(){return this.foo;}