2010-09-17 20 views
26

मैं उम्मीद है कि इस सवाल भी आसान नहीं है, लेकिन मुझे नहीं पता कि :(जावास्क्रिप्ट - फ़ंक्शन नाम में परिवर्तनीय, संभव है?

है कैसे मैं समारोह के नाम पर एक वर के साथ एक समारोह शुरू कर सकते हैं?

उदाहरण के लिए ...

मेरी कार्यों

function at_26(); 
function at_21(); 
function at_99(); 

समारोह शुरू

var test_id = 21; 
at_'+test_id+'(); // doesn't work 

मुझे उम्मीद है कि कोई मेरी मदद कर सकता है।

अग्रिम धन्यवाद! पीटर

+5

आपको लगता है कि आवश्यकता क्यों है? आप 'at()' नामक एक फ़ंक्शन बना सकते हैं और एक तर्क के रूप में इसे अपना नंबर पास कर सकते हैं। – jwueller

उत्तर

57

अपने कार्यों को शीर्ष स्तर बनाने के बजाय किसी ऑब्जेक्ट में स्टोर करें।

var at = { 
    at_26: function() { }, 
    at_21: function() { }, 
    at_99: function() { } 
}; 

उसके बाद आप उन्हें किसी अन्य वस्तु की तरह उपयोग कर सकते हैं:

at['at_' + test_id](); 

तुम भी उन्हें सीधे window वस्तु से भी एक्सेस कर सकता है ...

window['at_' + test_id](); 

... और उन में स्टोर करने के लिए होने से बचने एक वस्तु, लेकिन इसका मतलब वैश्विक दायरे में खेलना है जिसे टालना चाहिए।

+0

अच्छा विचार, बहुत बहुत धन्यवाद! – Peter

+5

मैं इस बारे में अधिक उत्सुक हूं कि कोई 100 फ़ंक्शन क्यों बनाएगा जो केवल एक इंडेक्स से अलग है ... – colithium

+3

टेस्ट। मान लीजिए कि आपके पास एक यूटिलिटी लाइब्रेरी है जो पथ को बदलने जैसे कुछ करता है। आपके पास प्रत्येक विधि का परीक्षण करने के लिए पथों की एक सरणी हो सकती है। प्रत्येक नई विधि के लिए परीक्षण चलाने के लिए कोड को डुप्लिकेट किए बिना लाइब्रेरी में उपयोगिताओं को जोड़ने का यह एक आसान तरीका है। – jonschlinkert

2

तुम भी

function at_26(){}; 
function at_21(){}; 
function at_99(){}; 

var test_id = 21; 
eval('at_'+test_id+'()'); 

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

+2

नहीं! इस मामले में 'eval()' का उपयोग न करें! यहाँ बहुत बेहतर समाधान हैं! – jwueller

+1

@elusive: सही है, बेहतर समाधान हमेशा इस्तेमाल किया जा रहा है। मैंने अभी वैकल्पिक समाधान दिया है। आशा है कि आपको यह बुरा लगेगा। – Nik

+2

चूंकि हर कोई अनिवार्य रूप से 'eval() 'की बुराई को नहीं जानता है, इसलिए आपको यह जानकारी अपनी पोस्ट में प्रदान करनी चाहिए। किसी को भी इस समाधान का उपयोग नहीं करना चाहिए जब तक कि उसका कोई अच्छा कारण न हो और यह जानकर कि वह क्या कर रहा है। 'eval()' के वैध उपयोग हैं लेकिन यह उनमें से एक नहीं है। – jwueller

17

आप करीब थे।

var test_id = 21 
this['at_'+test_id]() 

हालांकि, तुम क्या चाहते हो सकता है:

at = [] 
at[21] = function(){ xxx for 21 xxx } 
at[test_id]() 
+1

'यह [' is_awesome '] है; // धन्यवाद ' – Giraldi

0

एक बेहतर तरीका तो खिड़की वस्तु नहीं है - जो फ़ायरफ़ॉक्स में अनुकूल नहीं है - "स्व" के बजाय का उपयोग करें - उदाहरण के द्वारा पोस्ट में ऐसा क्वेंटिन यह इस तरह दिखता है:

self['at_' + test_id]();

संबंधित मुद्दे