2011-02-04 26 views
17

मैं हमेशा की तरह एक समारोह के लिए तर्क उत्तीर्ण कर ली है के लिए तर्क पासिंग:जावास्क्रिप्ट - समारोह

setValue('foo','#bar') 

function setValue(val,ele){ 
    $(ele).val(val); 
}; 

मूर्खतापूर्ण उदाहरण माफ कर दो। लेकिन हाल ही में मैं एक परियोजना पर काम कर रहा हूं जिसमें कुछ कार्य हैं जो बहुत सारे तर्क लेते हैं। और फिर समारोह में

setValue({ 
    val:'foo', 
    ele:'#bar' 
}); 

:: तो मैं तर्क, एक वस्तु (यकीन नहीं है कि अगर है कि डाल करने के लिए सही रास्ता है) के रूप में के माध्यम से गुजर इतना की तरह शुरू कर दिया

function setValue(options){ 

    var value = options.val; 
    var element = options.ele; 

    $(element).val(value); 

}; 

मेरा प्रश्न है, क्या ऐसा करने का एक बेहतर तरीका है? क्या इन 'विकल्पों' को कॉल करने के लिए यह सामान्य अभ्यास (या ठीक है) है? और क्या आपको आम तौर पर विकल्पों को 'अनपैक' (बेहतर अवधि की कमी के लिए) की आवश्यकता होती है और फ़ंक्शन के अंदर स्थानीय वर्र्स सेट करते हैं? अगर मैं उनमें से एक को परिभाषित नहीं किया गया तो मैं इसे इस तरह से कर रहा हूं।

मैं वास्तव में बुरी आदतों को नहीं बना रहा हूं और बदसूरत कोड का एक गुच्छा लिख ​​रहा हूं। किसी भी मदद की सराहना की है और + मेरे द्वारा। धन्यवाद।

+1

की तरह लगता है तुम हो सब ठीक कर रहा है। इसके अलावा, हाँ, {} जेएस में एक वस्तु (शाब्दिक नोटेशन में) है। मेरी एकमात्र टिप्पणी यह ​​है कि स्थानीय रूप से मूल्य का उपयोग क्यों करें जब आप विकल्प को पार कर सकते हैं। किसी अन्य फ़ंक्शन में औसत (लेकिन अगर आपको इसे 1 से अधिक अवसरों में संदर्भित करने की आवश्यकता है तो समझ में आता है)। –

+0

हाँ, यही वह था जो मैं उत्सुक था। तो मुझे लगता है कि उदाहरण की तरह किसी फ़ंक्शन के लिए आवश्यक नहीं है, लेकिन अगर मुझे var को संदर्भित करने की आवश्यकता है तो सेटिंग को समझना होगा। ठंडा। – jyoseph

उत्तर

14

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

मुझे लगता है कि विकल्प इसके लिए एक अच्छा नाम है हालांकि मैं इसे पर छोटा करता हूं।

मेरे पास हमेशा एक "डिफ़ॉल्ट" ऑब्जेक्ट है जो प्रत्येक उपलब्ध विकल्प के लिए डिफ़ॉल्ट मान निर्दिष्ट करता है, भले ही इसका शून्य हो। मैं jQuery का उपयोग करता हूं, इसलिए मैं केवल डिफ़ॉल्ट और उपयोगकर्ता द्वारा निर्दिष्ट विकल्पों को मर्ज करने के लिए $ .extend का उपयोग कर सकता हूं: var opts = $.extend({}, defaults, opts);

+0

मुझे $ .extend के विचार से प्यार है। उस भविष्य में देखने के लिए जा रहे हैं, धन्यवाद! – jyoseph

2

यदि आप jQuery कार्यान्वयन को देखते हैं, तो यह अधिकांश मनमानी-संख्या-पैरामीटर कार्यों को संभालने के लिए एक विकल्प वर्ग का उपयोग करता है, इसलिए मुझे लगता है कि आप अच्छी कंपनी में हैं।

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

1

उस अभ्यास के साथ कुछ भी गलत नहीं है।

"विकल्प" किसी भी नाम के रूप में अच्छा लगता है।

आपको उन्हें "अनपैक" करने की आवश्यकता नहीं है, लेकिन यदि आप एक ही आइटम को कई बार एक्सेस कर रहे हैं, तो स्थानीय चर में उन्हें संदर्भित करने के लिए यह थोड़ा और अधिक कुशल होगा क्योंकि स्थानीय चर पहुंच आमतौर पर संपत्ति से तेज होती है लुकअप।

10

मेरा मानना ​​है कि यह एक महान पैटर्न है। मैंने एक विकल्प ऑब्जेक्ट सुना है जैसे इसे अन्य भाषाओं में "बिल्डर ऑब्जेक्ट" के रूप में संदर्भित किया गया है (कम से कम ऑब्जेक्ट सृजन के संदर्भ में)। यहां कुछ फायदे हैं:

  • आपके फ़ंक्शन के उपयोगकर्ताओं को पैरामीटर के आदेश के बारे में चिंता करने की ज़रूरत नहीं है। यह आपके जैसे मामलों में विशेष रूप से सहायक है जहां विधि बहुत सारे तर्क लेती है। उन मिश्रित लोगों को प्राप्त करना आसान है, और जावास्क्रिप्ट शिकायत नहीं करेगा!
  • कुछ पैरामीटर वैकल्पिक बनाना आसान है (प्लगइन या उपयोगिता लिखते समय यह आसान होता है)।

हालांकि कुछ नुकसान हैं।विशेष रूप से, आपके फ़ंक्शन का उपयोगकर्ता कुछ विकल्पों को निर्दिष्ट नहीं कर सका और आपका कोड चकित होगा (ध्यान दें कि यह सामान्य जेएस फ़ंक्शन के साथ भी हो सकता है: उपयोगकर्ता को अभी भी सही तर्क प्रदान करने की आवश्यकता नहीं है)। इस से निपटने के लिए एक अच्छा तरीका पैरामीटर की आवश्यकता नहीं है के लिए डिफ़ॉल्ट मान प्रदान करना है:

var value = options.val || 0; 
var element = options.ele || {}; 

$(element).val(value); 

तुम भी तुरंत या throw an exception समारोह से लौट सकता है अगर सही तर्क की आपूर्ति नहीं कर रहे हैं।

बिल्डर ऑब्जेक्ट्स को संभालने के तरीके सीखने के लिए एक अच्छा संसाधन jQueryUI जैसी चीज़ों के स्रोत को देखना है।

+0

'var value = options.val || के साथ तारकीय उदाहरण || 0' - इससे एक टन मदद मिलेगी। महान लिंक भी। अनेक अनेक धन्यवाद! – jyoseph

4

मुझे पता है इस सवाल का एक साल का है, लेकिन मैं एक JavaScript फ़ंक्शन पर तर्कों की एक मनमाना संख्या पारित करने के लिए स्पष्ट तरीका एक सरणी उपयोग कर रहा है और apply विधि में बनाया गया लगता है:

fun.apply(object, [argsArray]) 

कहाँ fun कार्य है, object आपका दायरा/संदर्भ है जिसमें आप फ़ंक्शन को निष्पादित करना चाहते हैं और argsArray तर्कों की एक सरणी है (जो पारित होने के लिए किसी भी संख्या को दबा सकता है।

वर्तमान पिटफॉल अभी वर्तमान है कि तर्क एक सरणी (शाब्दिक या वस्तु) होना चाहिए और एक सरणी जैसी वस्तु नहीं है जैसे {'arg': 6, 'arg2': "stuff"}। ईसीएमएस्क्रिप्ट 5 आपको सरणी जैसी वस्तुओं को पास करने देगा, लेकिन यह केवल इस समय फ़ायरफ़ॉक्स में काम करता है और आईई 9 या क्रोम नहीं।

2

यह याद है कि सभी कार्यों एक बोनस पैरामीटर arguments एक जे एस सरणी (यह length है, लेकिन सरणी कार्यों में से कोई भी) कि सभी मापदंडों में पारित होता है की तरह बहुत ज्यादा एक वस्तु है कि कहा जाता है लायक है।

उपयोगी अगर आप मानकों की एक सीमा (जैसे

function Sum() { 
    var i, sum = 0; 
    for (i=0; i < arguments.length; i++){ 
     sum+=arguments[i]; 
    } 
    return sum; 
}; 

में पारित करने के लिए यदि यह स्थिति नहीं है चाहता हूँ और तुम सिर्फ मानकों का एक बहुत कुछ है, परम वस्तु का उपयोग के रूप में आप का वर्णन किया है।

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