जावास्क्रिप्ट चर संदर्भ / उपनाम


89

क्या जावास्क्रिप्ट में किसी स्थानीय संस्करण किसी अन्य के लिए उपनाम / संदर्भ निर्दिष्ट करना संभव है?

मेरा मतलब है कि कुछ सी-जैसे:

function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}

= ईडीआईटी =

क्या इस कोड में तर्क को अलग करना संभव है?

function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}

5
सरल उत्तर है नहीं। लेकिन मुझे लग रहा है कि एसओ में कोई व्यक्ति ऐसा करने के लिए हैक के साथ आएगा :)
— अमरघोष

जवाबों:


173

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

// declare an object with property x
var obj = { x: 1 };
var aliasToObj = obj;
aliasToObj.x ++;
alert( obj.x ); // displays 2

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

9
@ डारिन: यह थोड़ा ओवरसाइप्लाइज़िंग है। यह आदिम प्रकार बनाम वस्तुओं के बजाय अपरिवर्तनीय बनाम उत्परिवर्तनीय प्रकार है। जावास्क्रिप्ट में सब कुछ किसी न किसी रूप में एक वस्तु है।
— वर्धमान ताजा

7
जेएस में संदर्भ मूल्य द्वारा पारित किया जाता है। "पासिंग-बाय-रेफरेंस" और "पासिंग-ए-रेफरेंस-बाय-वैल्यू" के बीच अंतर है। जावास्क्रिप्ट में संदर्भ द्वारा मापदंडों के पारित होने का समर्थन नहीं किया गया है।
— कार्नेलियू

15

कुछ हद तक यह संभव है, आप क्लोजर का उपयोग करके एक वैरिएबल के लिए एक उपनाम बना सकते हैं:

Function.prototype.toString = function() {
    return this();
}

var x = 1;
var y = function() { return x }
x++;
alert(y); // prints 2, no need for () because of toString redefinition 

1
मेरा मानना ​​है कि "अलर्ट (y); // प्रिंट्स 2" होना चाहिए: "अलर्ट (y ()); // प्रिंट्स 2" आपको वास्तव में परिणाम प्राप्त करने के लिए फ़ंक्शन को कॉल करना होगा। बहुत बुरा, जैसा कि सुझाया गया वाक्यविन्यास कुछ स्थितियों में सहायक होगा।
— नाथन लाबेंज

3
यही कारण है कि फिर से परिभाषा एक कारण के लिए है, इसलिए alert(y)वास्तव में सही है। हालांकि फंक्शन प्रोटोटाइप तरीकों को फिर से परिभाषित करना बहुत खराब शैली है। लेकिन हे, यह काम करता है!
— मेटालिम

8

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

तर्कों। एक समारोह है, और इसलिए आप इसे करने के लिए एक संदर्भ हो सकता है और उस साझा वस्तु को संशोधित कर सकते हैं।

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}

ध्यान दें कि यदि उपर्युक्त कोड में आप कहते हैं self = function() {return 42;};तो selfफिर एक अलग वस्तु से संदर्भित करेगा arguments.callee, जो कि एक संदर्भ है foo। जब आपके पास एक कंपाउंड ऑब्जेक्ट होता है, असाइनमेंट ऑपरेटर संदर्भ को बदल देता है, तो यह संदर्भित ऑब्जेक्ट को नहीं बदलता है। परमाणु मूल्यों के साथ, जैसा मामला होता y++है, उसके बराबर होता है y = y + 1, जो चर को 'नया' पूर्णांक प्रदान कर रहा है।


यह उल्लेख नहीं करने के लिए कि arguments.calleeपहले से ही एक उपनाम है, जो फ़ंक्शन का नाम है। इस उदाहरण में आप सिर्फ इस्तेमाल कर सकते हैं foo.myStaticVar(शायद यह 2009 में मामला वापस नहीं था?)
— aljgom

1

मेरे पिछले उत्तर को संपादित करें: यदि आप किसी फ़ंक्शन के इनवोकेशन को गिनना चाहते हैं, तो आप कोशिश कर सकते हैं:

var countMe = ( function() {
  var c = 0;

  return function() {
    c++;
    return c;
  }
})();

alert(countMe()); // Alerts "1"
alert(countMe()); // Alerts "2"

यहाँ, c काउंटर के रूप में कार्य करता है, और आपको तर्कों का उपयोग नहीं करना पड़ता है।


या आप एक स्थिर चर का उपयोग कर सकते हैं countMe = function f(){ return ++f.c || (f.c = 1); }
— अल्जोम

1

User187291 के पोस्ट पर विस्तार करते हुए , आप फ़ंक्शन का उपयोग करने के लिए पाने के लिए गेटर्स / सेटर का भी उपयोग कर सकते हैं।

var x = 1;
var ref = {
    get x()  { return x; },
    set x(v) { x = v; }
};
(ref.x)++;
console.log(x); // prints '2'
x--;
console.log(ref.x); // prints '1'

0

2019 में मुझे minified jquery plugins लिखने की ज़रूरत है, इसलिए मुझे भी इस उपनाम की ज़रूरत है और इसलिए इन उदाहरणों और अन्य का परीक्षण करते हुए, अन्य स्रोतों से, मुझे एक पूरी तरह से whe की वस्तु की स्मृति में प्रतिलिपि के बिना एक रास्ता मिल गया, लेकिन केवल एक संदर्भ बना रहा है। मैंने पहले ही फ़ायरफ़ॉक्स के साथ इसका परीक्षण कर लिया था और इससे पहले फ़ायरफ़ॉक्स पर टास्क मैनेजर की टैब मेमोरी देख रहा था। कोड है:

var {p: d} ={p: document};
console.log(d.body);

यह संदर्भ द्वारा कुछ भी पारित नहीं करता है, आप बस सीधे दस्तावेज़ पास कर सकते हैं (जो पहले से ही एक वस्तु का संदर्भ है, और मूल्य द्वारा पारित किया गया है)। विनाशकारी उपनाम नहीं बनाता है।
— मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.