2011-06-22 21 views
6

, मैं कई घटनाओं के लिए श्रोताओं के रूप में विभिन्न कार्यों (तर्कों की विभिन्न संख्या) दर्ज करता हूं। जब घटना होती है, तो मुझे संबंधित फ़ंक्शन को आग लगाना पड़ता है। मुझे सरणी के रूप में श्रोता विधि को पारित करने के पैरामीटर प्राप्त होते हैं जबकि श्रोता कार्य प्रत्येक अलग तर्क की अपेक्षा करता है। तो, मैं इसे इस तरह कर रहा हूँ, लेकिन मैं दृष्टिकोण पसंद नहीं है और अगर वहाँ यह कर की एक सुंदर तरीका है जानना चाहते हैं,मेरी परियोजना में जावास्क्रिप्ट अज्ञात संख्या

function callListenerWithArgs(func, args){ 
     switch(args.length){ 
      case 1: 
       func(args[0]); 
       break; 
      case 2: 
       func(args[0], args[1]); 
       break; 
      case 3: 
       func(args[0], args[1], args[2]); 
       break; 
      case 4: 
       func(args[0], args[1], args[2], args[3]); 
       break; 
      default: 
       func(); 
     } 
    } 
+0

सभी लोगों को धन्यवाद। मज़ाकिया। बिल्कुल वही करता है जो मुझे चाहिए था। यह सरल और प्यारा है :) और मेरी समस्या को ठीक से संबोधित करता है। – Nutty

उत्तर

2

उपयोग का प्रयास करें।

func.apply(null, args) 

लागू आप एक विशिष्ट दायरे करने के लिए बाध्य करने की जरूरत है, तो आप में एक और तर्क समारोह के अंदर this के रूप में उपयोग करने के लिए पारित कर सकते हैं:

func.apply(scope, args); 

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

// will handle any number of args up to 7 
function callListenerWithArgs(func, args){ 
    func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); 
} 

अपने func के रूप में परिभाषित किया गया है:

function foo(a, b, c){ 
} 

आपको a, b, c कुछ undefined मानों को अनदेखा कर दिया गया है, साथ ही पास हो गया है। जैसा कि मैंने उपरोक्त कहा है, यह 95% मामलों में काम करता है। यह काम नहीं करता है अगर आपने कभी भी कॉल किए गए फ़ंक्शन में arguments.length की जांच की है क्योंकि फ़ंक्शन परिभाषित पैरामीटर की संख्या के बावजूद यह हमेशा समान होगा।

1

इस का उपयोग करते हुए function.apply

function callListenerWithArgs(func, args){ 
    func.apply(window, args); 
} 
+0

.call arrays नहीं लेता है। .apply –

+0

@cwolves करता है। मेरे जवाब फिर से देखो। – Neal

+2

आपने इसे संपादित किया है, मेरी टिप्पणी अभी भी लागू हुई है –

1

functionName.apply(thisScope, arguments) अधिक सुरुचिपूर्ण होगा। arguments तर्क एक सरणी होना चाहिए।

आप की तरह सरणी का निर्माण कर सकते हैं:

var args = []; 

switch (arguments.length - 1) { 
    case 0: 
     break; 
    case 1: 
     args.push(arguments[1]); 
     break; 
    case 2: 
     args.push(arguments[1], arguments[2]); 
     break; 
    case 3: 
     args.push(arguments[1], arguments[2], arguments[3]); 
     break; 
    default: 
     args = Array.prototype.slice.call(arguments, 1); 
} 

या यदि सरणी पहले से ही बनाया गया है, बस इसे दूसरा तर्क के रूप में पारित करने के लिए .apply

+0

@ डाउनवॉटर: समझाओ। – Robert

1
func.apply(this, args); 

देखें here

var f = function () { console.log(arguments.length); } 
f(2, 3) // > 2 

आप जगह में सीधे अपने func समारोह को लागू करने देता है:

-1

आप एक समारोह के तर्क की संख्या प्राप्त कर सकते हैं।

function func() { 
    var nbArgs = arguments.length; 
    // ... 
} 
संबंधित मुद्दे