दिलचस्प पोस्ट
जावा बनाने .jar फ़ाइल Android SDK स्थापना को स्वचालित करने का एक तरीका है? UICollectionView में सेल रिक्त स्थान दृश्य स्टूडियो में "stdafx.h" के लिए क्या उपयोग है? संसाधन आईडी से संसाधन नाम कैसे प्राप्त करें डेटाग्रीड WPF में चयनित पंक्ति आइटम प्राप्त करें PHP और जावास्क्रिप्ट के बीच एक सरणी को स्थानांतरित करने का सर्वोत्तम तरीका जावास्क्रिप्ट में अनिर्धारित या शून्य चर की जांच कैसे करें? मेरे UITableView के शीर्ष पर यूट्यूब में स्टाइल UITableViewStyleGrouped के साथ क्यों अतिरिक्त पैडिंग है <Input type = "file"> का उपयोग करते समय फ़ाइल स्वरूप को सीमित करें? ArrayList प्रारंभिक क्षमता और सूचकांकऑटोबॉफ़ अपवाद जीआईटी रेपो में एक्स मेगाबाइट्स पर फाइलें ढूंढें, जो हेड में मौजूद नहीं हैं I कैसे रजिस्ट्री में filetype एसोसिएशन को बदलने के लिए? स्विफ्ट में एरे से नाइल को फ़िल्टर करने के लिए एक एक्सटेंशन का निर्माण करना अजगर में स्पेक्ट्रोर्ग्म के लिए एफएफटी

जावास्क्रिप्ट में संकेतक?

क्या हम एक ऐसे चर का एक संदर्भ दे सकते हैं जो फ़ंक्शन में तर्क के रूप में अपरिवर्तनीय है?

उदाहरण:

var x = 0; function a(x) { x++; } a(x); alert(x); //Here I want to have 1 instead of 0 

Solutions Collecting From Web of "जावास्क्रिप्ट में संकेतक?"

चूंकि जावास्क्रिप्ट संदर्भ द्वारा पैरामीटर को पारित करने का समर्थन नहीं करता, आपको इसके बजाय एक ऑब्जेक्ट को ऑब्जेक्ट बनाने की आवश्यकता होगी:

 var x = {Value: 0}; function a(obj) { obj.Value++; } a(x); document.write(x.Value); //Here i want to have 1 instead of 0 

यह प्रश्न मदद कर सकता है: जावास्क्रिप्ट में संदर्भ से चर कैसे पारित किया जाए? ActiveX फ़ंक्शन से डेटा पढ़ें जो एक से अधिक मान देता है

संक्षेप में, जावास्क्रिप्ट आदिम प्रकार हमेशा मूल्य से पारित किए जाते हैं, जबकि वस्तुओं के अंदर मूल्य संदर्भ द्वारा पारित किया जाता है (मेरे उपेक्षा के लिए टिप्पणीकर्ताओं के लिए धन्यवाद) तो यह गोल करने के लिए, आपको एक ऑब्जेक्ट के अंदर अपना पूर्णांक डालना होगा:

 var myobj = {x:0}; function a(obj) { obj.x++; } a(myobj); alert(myobj.x); // returns 1 

मुझे एक अलग तरीके से पता लगाया गया है जो पॉइंटर्स को क्रियान्वित करता है जो सी परिप्रेक्ष्य से अधिक सामान्य और समझने में आसान होता है (और इस प्रकार उपयोगकर्ता उदाहरण के प्रारूप में अधिक फिट बैठता है)।

जावास्क्रिप्ट में, सी में, सरणी चर वास्तव में सिर्फ सरणी के संकेत हैं, इसलिए आप एक सरणी को एक सूचक के रूप में ठीक उसी तरह इस्तेमाल कर सकते हैं। इस तरह, आपके कोड के सभी बिंदुओं को उसी तरह इस्तेमाल किया जा सकता है, इसके बावजूद आपने वास्तविक ऑब्जेक्ट में वेरिएबल का नाम क्यों दिया।

यह भी एक संकेतक के पते की चर्चा करते हुए दो अलग-अलग संकेतनों का उपयोग करने की अनुमति देता है और संकेतक के पते पर है।

यहां एक उदाहरण है (मैं सूचक को निरूपित करने के लिए अंडरस्कोर का उपयोग करता हूं):

 var _x = [ 10 ]; function foo(_a){ _a[0] += 10; } foo(_x); console.log(_x[0]); 

पैदावार

 output: 20 

आप विंडो ऑब्जेक्ट से 'एक्स' देखें

 var x = 0; function a(key, ref) { ref = ref || window; // object reference - default window ref[key]++; } a('x'); // string alert(x); 

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

 function ptr(get, set) { return { get: get, set: set }; } function helloWorld(namePtr) { console.log(namePtr.get()); namePtr.set('jack'); console.log(namePtr.get()) } var myName = 'joe'; var myNamePtr = ptr( function () { return myName; }, function (value) { myName = value; } ); helloWorld(myNamePtr); // joe, jack console.log(myName); // jack 

ES6 में, लैम्ब्डा अभिव्यक्ति का उपयोग करने के लिए कोड छोटा किया जा सकता है:

 var myName = 'joe'; var myNamePtr = ptr(=> myName, v => myName = v); helloWorld(myNamePtr); // joe, jack console.log(myName); // jack 

जावास्क्रिप्ट में यह एक वैश्विक होगा हालांकि, आपका फ़ंक्शन इस तरह दिखता है:

 function a(){ x++; }; 

चूंकि x वैश्विक संदर्भ में है, इसलिए आपको फ़ंक्शन में इसे पास करने की आवश्यकता नहीं है।

जावास्क्रिप्ट सिर्फ मिश्रण coz में संकेत दिया जाना चाहिए यह समस्याओं की एक बहुत हल करती है इसका अर्थ है कोड किसी अज्ञात चर नाम या चर को गतिशील रूप से बनाया गया था। यह मॉड्यूलर कोडिंग और इंजेक्शन आसान बनाता है

यह वही है जो मैं सबसे करीबी के रूप में देख रहा हूं कि आप व्यवहार में सी पॉइंटर्स आ सकते हैं

जेएस में:

 var a = 78; // creates a var with integer value of 78 var pointer = 'a' // note it is a string representation of the var name eval (pointer + ' = 12'); // equivalent to: eval ('a = 12'); but changes value of a to 12 

सी में:

 int a = 78; // creates a var with integer value of 78 int pointer = &a; // makes pointer to refer to the same address mem as a *pointer = 12; // changes the value of a to 12 

यह असंभव हो सकता है क्योंकि जावास्क्रिप्ट में संदर्भ के द्वारा एक आदिम प्राप्त करने के लिए पर्ल के "\" ऑपरेटर नहीं है, लेकिन इस पद्धति का उपयोग करके एक आदिम के लिए "प्रभावी रूप से एक संकेतक" ऑब्जेक्ट बनाने का एक तरीका है।

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

 var proxyContainer = {}; // | attaches a pointer-lookalike getter/setter pair // | to the container object. var connect = function(container) { // | primitive, can't create a reference to it anymore var cant_touch_this = 1337; // | we know where to bind our accessor/mutator // | so we can bind the pair to effectively behave // | like a pointer in most common use cases. Object.defineProperty(container, 'cant_touch_this', { 'get': function() { return cant_touch_this; }, 'set': function(val) { cant_touch_this = val; } }); }; // | not quite direct, but still "touchable" var f = function(x) { x.cant_touch_this += 1; }; connect(proxyContainer); // | looks like we're just getting cant_touch_this // | but we're actually calling the accessor. console.log(proxyContainer.cant_touch_this); // | looks like we're touching cant_touch_this // | but we're actually calling the mutator. proxyContainer.cant_touch_this = 90; // | looks like we touched cant_touch_this // | but we actually called a mutator which touched it for us. console.log(proxyContainer.cant_touch_this); f(proxyContainer); // | we kinda did it! :) console.log(proxyContainer.cant_touch_this); 

जावास्क्रिप्ट में, आप किसी फ़ंक्शन के संदर्भ से चर को पार नहीं कर सकते। हालांकि आप किसी ऑब्जेक्ट को संदर्भ से पास कर सकते हैं।

मुझे लगता है कि सी के विपरीत या पॉइंटर्स के साथ कोई भी भाषा:

 /** Javascript **/ var o = {x:10,y:20}; var o2 = {z:50,w:200}; 
  • स्पष्ट रूप से जावास्क्रिप्ट में आप स्मृति में ऑब्जेक्ट्स और 2 पतों तक पहुंच नहीं सकते हैं
  • लेकिन आप उनके पते की तुलना नहीं कर सकते हैं: (उन्हें सॉर्ट करने के लिए कोई तुच्छ संभावना नहीं है, और फिर द्विगोष्ट द्वारा एक्सेस)

 o == o2 // obviously false : not the same address in memory o <= o2 // true ! o >= o2 // also true !! 

यह एक बड़ी समस्या है:

  • इसका मतलब है कि आप अपने अनुप्रयोग द्वारा बनाए गए सभी ऑब्जेक्ट्स को सूचीबद्ध / प्रबंधित कर सकते हैं,

  • वस्तुओं की उस विशाल सूची से, इनके बारे में कुछ जानकारी की गणना करें (उदाहरण के लिए उन्हें कैसे एक साथ जोड़ा जाता है)

  • लेकिन जब आप किसी विशिष्ट ऑब्जेक्ट के बारे में बनाई गई जानकारी को पुनः प्राप्त करना चाहते हैं, तो आप इसे अपने विशाल सूची में विखंडन द्वारा नहीं पा सकते हैं: प्रति वस्तु कोई अद्वितीय पहचानकर्ता नहीं है जो वास्तविक स्मृति पते के प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है

यह अंततः मतलब है कि यह एक बड़ी समस्या है, अगर आप जावास्क्रिप्ट में लिखना चाहते हैं:

  • एक जावास्क्रिप्ट डीबगर / आईडीई
  • या विशेष रूप से अनुकूलित कचरा कलेक्टर
  • एक डाटा संरचना ड्रॉवर / विश्लेषक

जावास्क्रिप्ट संदर्भ द्वारा आदिम प्रकारों को पारित करने के लिए समर्थन नहीं करता। एक वैकल्पिक हल है, हालांकि।

सभी चर को एक ऑब्जेक्ट में पास करने की जरूरत है। इस मामले में, केवल एक चर, x चर को पार करने के बजाय, एक स्ट्रिंग के रूप में चर नाम दें, जो "x"

 var variables = {x:0}; function a(x) { variables[x]++; } a("x"); alert(variables.x); 

आप क्या करना चाहते हैं इसके आधार पर, आप केवल वेरिएबल नाम सहेज सकते हैं, और बाद में इसे बाद में एक्सेस कर सकते हैं:

 function toAccessMyVariable(variableName){ alert(window[variableName]); } var myFavoriteNumber = 6; toAccessMyVariable("myFavoriteNumber"); 

आपके विशिष्ट उदाहरण पर लागू करने के लिए, आप ऐसा कुछ कर सकते हैं:

 var x = 0; var pointerToX = "x"; function a(variableName) { window[variableName]++; } a(pointerToX); alert(x); //Here I want to have 1 instead of 0 

आपके उदाहरण में आपके पास वास्तव में एक ही नाम के साथ 2 वेरिएबल हैं (ग्लोबल) वेरिएबल एक्स और फंक्शन स्केल वैरिएबल x जावास्क्रिप्ट को देखने के लिए दिलचस्प है, जब एक ही नाम के 2 वेरिएबल्स के साथ क्या करना है, तो फ़ंक्शन को स्कॉड नाम के साथ जाता है और आउट-ऑफ-स्कोप वैरिएबल को अनदेखा करता है।

शायद यह संभव नहीं है कि जावास्क्रिप्ट को इस तरह से व्यवहार करना होगा …

चीयर्स!