दिलचस्प पोस्ट
एक दिए गए रेखा के लिए जेएसहंट चेतावनी को दबाने का कोई तरीका क्या है? पैरामीटर वाली क्वेरीज़ बनाम एसक्यूएल इंजेक्शन कैसे प्रोग्राम की मात्रा को सिस्टम मात्रा निर्धारित करें? विजुअल स्टूडियो 2015 में डीएनएक्स / डीएनवीएम कैसे ठीक करें? एजेक्स अनुरोध के साथ प्रगति की प्रगति दिखा रहा है C ++ में स्ट्रिंग से कुछ वर्ण कैसे निकालें? एंड्रॉइड स्टूडियो डिवाइस नहीं देखता है एंड्रॉइड वेबव्यू में यूट्यूब एचटीएमएल 5 एंबेड वीडियो प्ले करें XML अर्थ में "xmlns" क्या होता है? जावा में यूआरएल से जेएसएन को पढ़ने का सबसे आसान तरीका कैसे एक टंकिनर आवेदन में एक टर्मिनल एम्बेड करने के लिए? मैं git के मर्ज कमिट संदेश को कैसे कस्टमाइज़ कर सकता हूं? कैसे सी # का उपयोग कर एक खिड़कियों फ़ॉन्ट स्थापित करने के लिए एंड्रॉइड एसडीके स्थापना जेडीके नहीं मिलती रेल के साथ पूरी तरह से कस्टम सत्यापन त्रुटि संदेश

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

उदाहरण 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 

Solutions Collecting From Web of "जावास्क्रिप्ट बाइंड क्यों आवश्यक है?"

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

इसका मान निर्धारित किया जाता है कि फ़ंक्शन को कैसे कहा जाता है । यदि आप ऐसा हैं जो फ़ंक्शन कॉल करता है तो आमतौर पर उपयोग करने की कोई आवश्यकता नहीं है .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;}