2009-10-25 19 views
6

मैं एक जावास्क्रिप्ट फ़ंक्शन कैसे लिखूं जो पैरामीटर की एक चर संख्या को स्वीकार करता है, और उन सभी पैरामीटर को अन्य अज्ञात कार्यों के लिए आगे बढ़ाता है?एक जेएस फ़ंक्शन कैसे लिखता है जो पैरामीटर की चर संख्या को स्वीकार करता है और "आगे" करता है?

उदाहरण के लिए, एक विधि है कि एक गतिविधि सक्रिय की परिदृश्य पर विचार करें:

function fireStartedEvent(a,b,c,d,e,f,g,...) { 
    for(var i = 0; i < startedListeners.length; i++) { 
     startedListeners[i](a,b,c,d,e,f,g,...); 
    } 
} 

खासकर के बाद से मैं एक घटना कारखाना है कि इन आग तरीकों उत्पन्न करता है, इन तरीकों कितने मापदंडों जानने में किसी दिए गए कोई दिलचस्पी नहीं है घटना या उसके हैंडलर उपभोग करते हैं। तो मैंने अभी 7 पर हार्ड-वायर्ड किया है (एक जी के माध्यम से)। यदि यह कम है, कोई समस्या नहीं है। यदि यह और भी है, तो वे काट लेंगे। मैं बस पर सभी पैरामीटर कैप्चर और पास कैसे कर सकता हूं?

धन्यवाद।

(jQuery या किसी अन्य Javascript फ़्रेमवर्क का उपयोग करते हुए एक विकल्प यहाँ नहीं है।)

+0

यह जावास्क्रिप्ट में एक सरणी के रूप में पैरामीटर पास करना संभव है? वह ऐसा कर सकता है। – Cyclone

उत्तर

8

सुलझाने इस दो जावास्क्रिप्ट अवधारणाओं के ज्ञान की आवश्यकता है।

पहला विशेष arguments स्थानीय चर है जिसका उपयोग उनके नाम जानने के बिना फ़ंक्शन तर्कों तक पहुंचने के लिए किया जा सकता है और यह एक ऐरे की तरह काम करता है। हालांकि, argumentsनहीं एक Array है, लेकिन "की तरह सरणी" है -, होने गुण 0..n-1 नामित जहां n कार्य करने के लिए तर्क की संख्या और एक length संपत्ति है - वस्तु। एक साधारण प्रदर्शन उपयोग हो सकता है:

function f (a) { // can include names still, if desired 
    // arguments instanceof Array -> false (exceptions to this?) 
    var firstArg = arguments[0] 
    // a === firstArg -> always true 
    // iterate all arguments, just as if it were an Array: 
    for (var i = 0; i < arguments.length; i++) { 
     alert(i + " : " + arguments[i]) 
    } 
} 
f("a","b","c") 

दूसरी सुविधा Function.apply जो एक विशिष्ट संदर्भ (this जब यह कहा जाता है) तर्क के साथ कि एक "की तरह सरणी" के विस्तार से परिणाम के साथ एक समारोह आह्वान जाएगा वस्तु। लेकिन देखें।

function fireStartedEvent() { 
    for(var i = 0; i < startedListeners.length; i++) { 
     // jQuery will often pass in "cute" things, such as a element clicked 
     // as the context. here we just pass through the current context, `this`, 
     // as well as the arguments we received. 
     var arg = Array.prototype.slice.call(arguments) 
     startedListeners[i].apply(this, args) 
    } 
} 

ECMAScript विनिर्देश केवल वस्तु एक "की तरह सरणी" के लिए कहता है, वहीं Function.applyनहीं है सार्वभौमिक एक "की तरह सरणी" के साथ काम:

इस प्रकार, यह एक साथ डाल ऑब्जेक्ट और कई सामान्य कार्यान्वयन को उचित Array ऑब्जेक्ट की आवश्यकता होती है। Function.apply लिंक से चेतावनी:

नोट: क्रोम 14 और इंटरनेट एक्सप्लोरर 9 सहित, अभी भी वस्तुओं की तरह सरणी को स्वीकार नहीं करते और एक अपवाद [अगर एक गैर सरणी वस्तु फेंक होगा अधिकतर ब्राउज़र, पारित कर दिया गया है]। [फ़ायरफ़ॉक्स संस्करण 4 में तय किया गया था।

var args = Array.prototype.slice.call(arguments); 
:]

शुक्र है, वहाँ एक अपेक्षाकृत बस एक Array में वस्तु एक "की तरह सरणी" चालू करने के लिए (जो विडंबना है क्योंकि Array.slice सार्वभौमिक वस्तु एक "की तरह सरणी" के साथ काम करता है) मुहावरा है

(और फिर args सार्वभौमिक में इस्तेमाल किया जा सकता Function.apply में इस्तेमाल किया जा।)

+0

पूछताछ करने वाले को क्या लागू करना प्रतीत नहीं होता है। – mauris

+5

मुझे लगता है कि यह * बिल्कुल * पूछताछकर्ता क्या चाहता है। – bcat

+0

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

5

मुझे लगता है कि "लागू" और "तर्क" तुम यहाँ का उपयोग कर सकते दो जावास्क्रिप्ट अवधारणाओं हैं:

function fireStartedEvent() { 
    for (var i = 0; i < startedListeners.length; i++) { 
    startedListeners[i].apply(startedListeners[i], arguments); 
    } 
} 

यहाँ मेरी Firebug कंसोल से कुछ कोड मैं के साथ इस बाहर की कोशिश की है:

a = function(foo) { alert('a: ' + foo); }; 
b = function(foo, bar) { alert('b: ' + foo + ', ' + bar); }; 

startedListeners = [a, b]; 

function fireStartedEvent() { 
    for (var i = 0; i < startedListeners.length; i++) { 
    startedListeners[i].apply(startedListeners[i], arguments); 
    } 
} 


fireStartedEvent('one', 'two'); 
+0

यह कोड सही नहीं है। तर्क सरणी की तरह है। यह "एक सरणी" नहीं है। आवेदन द्वितीय पैरामीटर के रूप में एक सरणी लेता है। –

+0

pst, यह मेरे लिए काम करता प्रतीत होता है, जिसमें लागू (शून्य, तर्क) का उपयोग करके लागू विधि को सभी विशिष्ट तर्कों को पहचानने लगता है। क्या कोई समस्या है जो मुझे याद आ रही है? –

+0

@pst - मुझे यह नहीं पता था - क्या आपके पास ऐसा उदाहरण है जहां मैंने पोस्ट किया गया फ़ंक्शन काम नहीं करता है? –

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

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