दिलचस्प पोस्ट
पायथन अपवाद लॉग करने का सर्वोत्तम तरीका कैसे एक सदस्य समारोह सूचक के माध्यम से कॉल करने के लिए? मैं कैसे स्थिति प्राप्त कर सकता हूं और ओपनसीवी का उपयोग करके आयताकार बना सकता हूं? के लिए CNContactViewControllerUnknownContact अनुपयोगी, इंटरफ़ेस नष्ट कर देता है कैसे कंटोइस एचजी का उपयोग कर भट्ठा / मर्क्यूरीयल में फ़ाइलों को अनदेखा करने के लिए "जो कि रिपॉजिटरी का हिस्सा हैं" मैं जावास्क्रिप्ट के साथ चयन विकल्प कैसे छिपा सकता हूं? (क्रॉस ब्राउज़र) जावा का कलेक्शन। शफ़ल क्या कर रहा है? PHP के लिए सबसे अच्छा आईडीई क्या है? अपाचे / PHP के साथ X-Sendfile का उपयोग करना टंकिनर अजगर 3 में विभिन्न वर्गों से चर तक कैसे पहुंचें XAMPP अपाचे सर्वर स्काइप स्थापना के बाद शुरू नहीं हो रहा है क्यों नहीं std :: स्ट्रिंग चार * के लिए अंतर्निहित रूपांतरण प्रदान करते हैं? क्या खुला स्रोत सी ++ स्थिर विश्लेषण उपकरण उपलब्ध हैं? मैं किसी फ़ंक्शन के अंदर समारोह को परिभाषित क्यों नहीं कर सकता? $ (विंडो) के बीच का अंतर। लोड () और $ (दस्तावेज़) .ready () फ़ंक्शन

मैं एक प्रोटोटाइप फ़ंक्शन में "यह" के लिए एक नया मान क्यों नहीं दे सकता?

मैं ऐसा क्यों कर सकता हूं:

Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]); } 

लेकिन मैं ऐसा नहीं कर सकता:

 Array.prototype.foo = function() { return this = [1,2,3]; } 

दोनों फ़ंक्शंस इस के मूल्य को नष्ट कर देते हैं और इसे [1,2,3] बदल देते हैं, लेकिन दूसरा एक निम्न त्रुटि को फेंकता है: Uncaught ReferenceError: Invalid left-hand side in assignment त्रुटि: Uncaught ReferenceError: Invalid left-hand side in assignment

मुझे यह संदेह है क्योंकि काम की अनुमति देने का मतलब है कि मैं संभावित रूप से सरणी को कुछ और (एक स्ट्रिंग की तरह) में बदल सकता हूं, लेकिन मैं उम्मीद कर रहा हूं कि किसी को पता होना चाहिए और / या अधिक विस्तृत व्याख्या है।

Solutions Collecting From Web of "मैं एक प्रोटोटाइप फ़ंक्शन में "यह" के लिए एक नया मान क्यों नहीं दे सकता?"

किसी फ़ंक्शन के भीतर this एक मूल्य निर्दिष्ट करने की अनुमति नहीं है। मान लीजिए कि आप ऐसा कर सकते हैं, और आपका कोड कुछ ऐसा दिखता है:

 Array.prototype.foo = function() { return this = [1, 2, 3]; } var a = ["beans", "rice"]; a.foo(); // a now points to an object containing [1, 2, 3] 

अब, अगर आप ऐसा करते हैं:

 var a = ["beans", "rice"]; var b = a; // b refers to the same object as a b.foo(); // what does b refer to now? how about a? 

किसी फ़ंक्शन पर फ़ंक्शन .foo() कार्य वस्तु पर पहचान नहीं बदलना चाहिए। यह कॉल करने वाले के लिए बहुत भ्रामक होगा अगर b अचानक किसी अन्य ऑब्जेक्ट की तुलना करना शुरू कर दिया क्योंकि किसी विधि को बुलाया गया था।

आप संदर्भों के साथ वस्तुओं को भ्रमित कर रहे हैं।

एक सरणी एक ऑब्जेक्ट है, जब आप एक शाब्दिक उपयोग करते हैं [1,2,3] आप एक नया सरणी बना रहे हैं

this तरह के एक वैरिएबल नाम या ऑब्जेक्ट का एक संदर्भ है। यदि यह मदद करता है, तो एक वस्तु के रूप में एक वस्तु की कल्पना करें, और उनके उपनाम के रूप में संदर्भ। आपके पास एक ही वस्तु के एक से अधिक संदर्भ हो सकते हैं, उदाहरण के लिए:

 var a = [1,2]; var b = a; b.push(3); alert(a.length); // Gives "3" 

कल्पना करो अगर आपके पास सारा नाम का मित्र था आप कभी भी उसे "ऐस" कहते हैं अगर सारा को एक दिन बाल कटवाने लगता है, ऐस का एक बाल कटवाने भी है, क्योंकि "सारा" और "ऐस" एक ही व्यक्ति के लिए अलग-अलग नाम हैं।

यदि आप एक a.push या a.splice जैसे एक उत्परिवर्ती सरणी पद्धति का उपयोग करते हैं ( a.splice हालांकि एक नहीं है!), आप मौजूदा एरे ऑब्जेक्ट को बदलते हैं, और फिर भी a ही ऑब्जेक्ट को संदर्भित करता है। यह बाल कटने की तरह है – आप अलग दिख सकते हैं, लेकिन आप अभी भी एक ही व्यक्ति हैं।

जब आप एक नया मान के संदर्भ को निर्दिष्ट करते हैं, तो a = [1,2,3] , आप एक नया सरणी बना रहे हैं, और इसे संदर्भित करने के लिए बदल रहे हैं। यह अलग बालों के साथ एक नए दोस्त को खोजने की तरह है, और इसके बजाय ऐस को कॉल करने का निर्णय करना

अब this जावास्क्रिप्ट द्वारा उत्पन्न एक विशेष नाम है। यह सारा जैसा दिया गया नाम नहीं है, लेकिन एक शीर्षक से अधिक है, जैसे "माँ" आपकी मां एक नया बाल कटवाने पा सकती है, लेकिन आपको एक नई मां नहीं मिल सकती है इसी तरह, आप इसे किसी फ़ंक्शन के अंदर से संदर्भित नहीं कर सकते।

आपको इसे पुन: असाइन करने की अनुमति नहीं है। क्योंकि निष्पादन संदर्भ से संबंधित यह मान अपरिवर्तनीय है।

क्या this के मूल्य को बदलना संभव है? असाइनमेंट द्वारा नहीं, आप this एक मान निर्दिष्ट नहीं कर सकते

आपका मुकदमा:

 Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]); } 

लेकिन मैं ऐसा नहीं कर सकता:

 Array.prototype.foo = function() { return this = [1,2,3]; } 

जब आप विधि जोड़ने foo() प्रोटोटाइप को संशोधित करते हैं, तो पहला भाग सरणी खाली हो जाता है, उसके उदाहरण को दोबारा असाइन करने के बराबर होता है।

उदाहरण के लिए var a = []

फिर बदले मूल्य में:

 return this.concat([1,2,3]); 

याद रखें कि concat एक सरणी को नष्ट नहीं करता है, यह एक नई सरणी बनाता है और इसे वापस करता है

a = ['x'] और b = ['y'] , c = a.concat(b) परिणाम c = ['x','y'] , और a और b उसी प्रकार के होते हैं जितने वे थे

अब जब आप यह सरणी के अंदर कर रहे हैं

 a=['a','b','c'] 

तो आप a.foo(); कॉल a.foo(); , अंदर a बराबर a=[] प्राप्त होगा, इस. this.splice(0, this.length); तो [1,2,3] साथ [1,2,3] [ ] सम्मिलित करेगा

इसलिए यदि मैं सिर्फ a.foo() कहता हूं, तो वास्तव में कुछ भी नहीं होता है, अगर मैं परिणाम को किसी चीज़ को निर्दिष्ट नहीं करता, तो बस एक खाली रहता है

अगर a को कुछ सौंपा गया है

 c = a.foo() 

फिर c होगा [1,2,3] , और अभी भी खाली [ ]

दूसरे भाग में, this = [1,2,3]

इस के मूल्य को बदलना संभव है ?, असाइनमेंट द्वारा नहीं, आप इस पर एक मान निर्दिष्ट नहीं कर सकते