2009-11-06 12 views
84

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

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

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; 
} 
+4

सरल उत्तर नहीं है। लेकिन मुझे एहसास है कि एसओ में कोई ऐसा करने के लिए एक हैक के साथ आएगा :) – Amarghosh

उत्तर

161

जावास्क्रिप्ट, आदिम प्रकार में arguments.callee यह संभव उर्फ ​​करने के लिए है जैसे कि पूर्णांक और तारों को मूल्य से पारित किया जाता है जबकि वस्तुओं को संदर्भ द्वारा पारित किया जाता है। मेरे पिछले जवाब देने के लिए

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

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

+0

क्या आप अपना कोड पोस्ट कर सकते हैं? –

+0

पोस्ट किया गया। मैं इस जवाब को स्वीकार करता हूं क्योंकि मेरा प्रश्न बहुत सामान्य था। – gpilotino

1

संपादित करें:: तो इस आप किसी चीज़ का इस्तेमाल करने की जरूरत है को प्राप्त करने के लिए यदि आप एक समारोह के आमंत्रण की गणना करना चाहते हैं, तो आप कोशिश करना चाहते हो सकता है:

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

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

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

यहाँ, सी काउंटर के रूप में कार्य करता है, और आपको arguments.callee का उपयोग करने की आवश्यकता नहीं है।

+0

या आप एक स्थिर चर का उपयोग कर सकते हैं 'countMe = function f() { वापसी ++ f.c || (f.c = 1); } ' – aljgom

12

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

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 " आप वास्तव में करने के लिए फ़ंक्शन को कॉल करने के लिए है परिणाम प्राप्त करें। बहुत बुरा, क्योंकि कुछ स्थितियों में सुझाए गए वाक्यविन्यास सहायक होंगे। –

+2

कि टॉस्ट्रिंग पुन: परिभाषा किसी कारण से है, इसलिए 'अलर्ट (वाई)' वास्तव में सही है। हालांकि फ़ंक्शन प्रोटोटाइप विधियों को फिर से परिभाषित करना बहुत खराब शैली है। लेकिन हे, यह काम करता है! – metalim

7

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

arguments.callee एक फ़ंक्शन है, और इसलिए आप इसका संदर्भ ले सकते हैं और साझा ऑब्जेक्ट को संशोधित कर सकते हैं।

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 के बराबर है, जो चर के लिए 'नया' पूर्णांक असाइन कर रहा है।

+0

धन्यवाद, यही मुझे जानने की जरूरत है। – gpilotino

+0

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

0

मैं अपने प्रोजेक्ट के लिए आज की खोज और इस जो ऐसा करने के लिए सबसे अच्छा तरीका हो करने के लिए लग रहा है पाया: http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

+4

अपनी पोस्ट में सुधार करने पर विचार करें क्योंकि आपका उत्तर अनिवार्य रूप से एक लिंक है। देखें: [क्या उत्तर हैं कि वास्तव में कहीं और "अच्छे उत्तर" लिंक हैं?] (Http://meta.stackexchange.com/q/8231/156620) और [बुरा लिंक क्यों है?] (Http: //meta.stackexchange .com/q/7515/156,620) –

1

पर user187291's post विस्तार, आप भी getters/setters कार्यों का उपयोग करने के लिए चारों ओर पाने के लिए इस्तेमाल कर सकते हैं।

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' 
संबंधित मुद्दे