2010-08-04 29 views
20

पर पारित होने के बाद चर के मूल नाम का निर्धारण करें मुझे यह महसूस हो रहा है कि यह संभव नहीं हो सकता है, लेकिन मैं जावास्क्रिप्ट में किसी फ़ंक्शन को पास कर दिया गया एक चर का मूल चर नाम निर्धारित करना चाहता हूं। मुझे नहीं पता कि इससे बेहतर तरीके से इसे कैसे समझाया जाए, तो देखें कि यह उदाहरण समझ में आता है या नहीं।फ़ंक्शन

function getVariableName(unknownVariable){ 
    return unknownVariable.originalName; 
} 

getVariableName(foo); //returns string "foo"; 
getVariableName(bar); //returns string "bar"; 

यह मैं पर काम कर रहा हूँ एक jQuery प्लगइन के लिए है, और मैं चर जो एक "डिबग" कार्य करने के लिए पारित हो जाता है के नाम प्रदर्शित करने के लिए सक्षम होने के लिए करना चाहते हैं।

+1

मुझे यकीन नहीं है कि इसका उद्देश्य क्या है, क्योंकि आपको परिवर्तनीय नामों से परिवर्तनीय मानों में रूचि प्राप्त करने की आवश्यकता होगी। –

+2

कोई प्रोग्राम चल रहा है जब कोई चर नाम नहीं हैं। कोई "वर्तमान" नहीं, और कोई "मूल" नहीं। – Tomalak

+1

हाहा, मुझे लगा कि यह एक लम्बा शॉट था, लेकिन फिर भी एक शॉट के लायक था। बहुत अधिक उद्देश्य नहीं है, लेकिन यदि आप संदर्भ चाहते हैं तो आप प्लगइन का वर्तमान संस्करण देख सकते हैं: http://andygroff.com/jquery-debugger-debugging-plugin/ यदि आप ऑब्जेक्ट उदाहरण देखते हैं, तो मैं पसंद करते हैं कि शीर्षक "ऑब्जेक्ट प्रॉपर्टीज" के बजाय "कपड़ों कॉम्प्नी प्रॉपर्टीज" कहता है, यह बहुत महत्वपूर्ण नहीं है, लेकिन अच्छा होगा। –

उत्तर

17

आप सही हैं, यह किसी भी तरह से असंभव है, क्योंकि केवल फ़ंक्शन में मूल्य पारित हो जाता है।

+7

पागल तरीका क्या है? –

+9

बैकट्रैक प्राप्त करें, फ़ंक्शन आमंत्रण की फ़ाइल और लाइन संख्या प्राप्त करें, उस फ़ाइल का स्रोत कोड लोड करें, उस पंक्ति को ढूंढें और पार्स करें, यह पता लगाने का प्रयास करें कि आपका पैरामीटर कौन सा चर था। चूंकि एक पंक्ति पर फ़ंक्शन कॉल की संख्या हो सकती है और कार्य की जटिलता का उल्लेख न करने के लिए रनटाइम पर फ़ंक्शंस को अलिया किया जा सकता है, मुझे उम्मीद है कि इसकी पागलपन स्वयं स्पष्ट है। – deceze

+0

यह अब कुछ हद तक संभव है, मेरा जवाब देखें। – Offirmo

1

यहां एक तकनीक है जिसका उपयोग आप चर और चर के मान को रखने के लिए कर सकते हैं।

// Set up a global variable called g 
var g = {}; 
// All other variables should be defined as properties of this global object 
g.foo = 'hello'; 
g.bar = 'world'; 

// Setup function 
function doStuff(str) { 
    if (str in g) { 
    var name = str; 
    var value = g[str]; 
    // Do stuff with the variable name and the variable value here 
    // For this example, simply print to console 
    console.log(name, value); 
    } else { 
    console.error('Oh snap! That variable does not exist!'); 
    } 
} 

// Call the function 
doStuff('foo'); // log: foo hello 
doStuff('bar'); // log: bar world 
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist! 

यह प्रभावी रूप से एक शब्दकोश बनाता है जो परिवर्तनीय नामों को उनके मूल्य पर नक्शा बनाता है। यह संभवतः आपके मौजूदा कोड के लिए प्रत्येक चर को पुन: सक्रिय किए बिना काम नहीं करेगा। लेकिन इस शैली का उपयोग करके, आप इस प्रकार की समस्या के लिए एक समाधान प्राप्त कर सकते हैं।

+0

उत्तर के लिए धन्यवाद। यह एक अच्छा समाधान है, हालांकि यह वास्तव में मेरी समस्या का समाधान नहीं करता है। मैं एक डिबगिंग प्लगइन लिख रहा था जो इसके नाम सहित चर पर जानकारी के साथ एक मोडल अलर्ट बनाने जा रहा था। इसे किसी भी जावास्क्रिप्ट के साथ चलाने की आवश्यकता होगी, इसलिए ऑब्जेक्ट गुणों के रूप में सभी चर भंडारण एक व्यावहारिक समाधान नहीं है। धन्यवाद! –

+0

@AndyGroff 'विंडो' चर के लिए 'g' चर को प्रतिस्थापित करने से आपकी समस्या हल हो सकती है। लेकिन आखिरकार आपको पहचानकर्ता के बजाय स्ट्रिंग द्वारा वेरिएबल्स तक पहुंच प्राप्त करनी होगी। – styfle

1

ठीक है, सभी वैश्विक चर वैश्विक वस्तु (यह या खिड़की) के गुण हैं, है ना?

var getName = function(variable) { 
    for (var prop in window) { 
    if (variable === window[prop]) { 
     return prop; 
    } 
    } 
} 
var helloWorld = "Hello World!"; 
console.log(getName(helloWorld)); // "helloWorld" 

कभी कभी काम नहीं करता है, उदाहरण के लिए, 2 तार नया ऑपरेटर के बिना बनाया है और एक ही मूल्य है कर रहे हैं: तो जब मैं अपने चर का नाम पता करना चाहता था, मैं निम्नलिखित समारोह बना दिया।

a=b=c=3; 
console.log(makeJSON('a','b','c')); 

शायद यह है कि इस प्रश्न के

+0

क्या यह ब्राउज़र में चलाने पर निर्भर करता है? या क्या मैं गलत समझ रहा हूं कि 'खिड़की' क्या है? – byxor

+1

यदि दो ऑब्जेक्ट्स का एक ही मूल्य हो तो यह काम नहीं करेगा। 'window.a = 1; window.b = 1; 'यह पहले मिलान मान का नाम वापस कर देगा। इसके अतिरिक्त, वैश्विक दायरे में चर को परिभाषित करना बुरा अभ्यास है। – styfle

0

एक JSON ऑब्जेक्ट है जिसके लिए मैं इस समारोह

function makeJSON(){ //Pass the variable names as string parameters [not by reference] 
ret={}; 
for(i=0; i<arguments.length; i++){ 
    eval("ret."+arguments[i]+"="+arguments[i]); 
} 
return ret; 
} 

उदाहरण लिखा में अद्वितीय चर का एक सेट परिवर्तित अब किसी भी तरह से संभव है ES6:

function getVariableName(unknownVariableInAHash){ 
 
    return Object.keys(unknownVariableInAHash)[0] 
 
} 
 

 
const foo = 42 
 
const bar = 'baz' 
 
console.log(getVariableName({foo})) //returns string "foo" 
 
console.log(getVariableName({bar})) //returns string "bar"

केवल (छोटे) पकड़ आप {} के बीच अपने अज्ञात चर, जो कोई बड़ी बात नहीं है रैप करने के लिए होता है।

+5

'ret [x] = x'; यहां 'eval' के लिए बिल्कुल कोई कारण नहीं है! – deceze

1

के लिए कारण यह है:

+1

'{foo}' सिर्फ '{foo: 42} 'है ... तो आप इसे केवल एक वस्तु के रूप में भेज रहे हैं। 'ईसीएमएस्क्रिप्ट 2015 में नई टिप्पणियां' देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer –

+0

@ कोडीजी। मैं इसके बारे में पूरी तरह से अवगत हूं। – Offirmo

+1

तब आपको "एएस 6 के लिए किसी भी तरह से संभव धन्यवाद" नहीं कहना चाहिए, आपका जवाब मूल रूप से --- 'आप वैरिएबल नाम के रूप में कुंजी के साथ एक वस्तु के रूप में मूल्य भेजकर ऐसा कर सकते हैं' ... जो भी आसानी से किया जाता है ऑब्जेक्ट.की के पॉलीफिल के साथ es5 में, या बस किसी अन्य प्रॉपर्टी के रूप में वेरिएबल नाम के साथ ऑब्जेक्ट पास करके। –