2013-07-07 3 views
11

मैं फ़ंक्शन के भीतर से किसी फ़ंक्शन में तर्क कैसे अग्रेषित करूं?किसी फ़ंक्शन के किसी अन्य फ़ंक्शन के सभी-लेकिन-द-फर्स्ट-तर्क तर्कों को 'अग्रेषित' कैसे करें?

मैं इस है:

function SomeThing(options) { 
    function callback(callback_name) { 
    if(options[callback_name]) { 
     // Desiring to call the callback with all arguments that this function 
     // received, except for the first argument. 
     options[callback_name].apply(this, arguments); 
    } 
    } 
    callback('cb_one', 99, 100); 
} 

क्या मैं a तर्क में मिलता है 'cb_one' है, लेकिन मैं चाहता हूँ कि यह '99' होना चाहिए।

var a = new SomeThing({ 
    cb_one: function(a,b,c) { 
    console.log(arguments); // => ["cb_one", 99, 100] 
    console.log(a);   // => cb_one 
    console.log(b);   // => 99 
    console.log(c);   // => 100 
    } 
}); 

मैं यह कैसे कर सकता हूं?

उत्तर

22

उपयोग options[callback_name].apply(this, [].slice.call(arguments,1));

[].slice.call(arguments,1) कोई वास्तविक Array सभी तर्कों लेकिन पहले युक्त में तर्क ('array-like') Object बदल देता है।

[].slice.call को Array.prototype.slice.call के रूप में भी लिखा जा सकता है।

+5

यह स्पष्ट हो सकता है इसके बजाय मैं यह कर '[] .slice.call' के बजाय' Array.prototype.slice.call' का उपयोग करने के लिए - यह दिखाता है कि खाली सरणी के बारे में कुछ खास नहीं है। –

1

आप कुइलिनक क्या कर सकते हैं। व्यक्तिगत रूप से हालांकि मुझे [].slice.call या Arrray.prototype.slice.call लिखना पसंद नहीं है।

var bind = Function.bind; 
var call = Function.call; 

var bindable = bind.bind(bind); 
var callable = bindable(call); 

// this is the same as Array.prototype.slice.call 
var arrayFrom = callable(Array.prototype.slice); 

अब आप सरल कर सकते हैं::

options[callback_name].apply(this, arrayFrom(arguments, 1)); 

अधिक जानकारी के लिए के बारे में bindable और callable जावास्क्रिप्ट चैट रुम में लोगों के लिए बात करते हैं: http://chat.stackoverflow.com/rooms/17/javascript

+0

क्यों 'बाध्यकारी'? बस 'var slice = Function.call.bind (Array.prototype.slice); ' – 1983

+0

क्योंकि कोड की 5 पंक्तियों में आपको 3 उपयोगी फ़ंक्शंस मिलते हैं -' बाइंडेबल ',' कॉल करने योग्य 'और' arrayFrom' जिसका उपयोग कई लोगों में किया जा सकता है विभिन्न मामलों उदाहरण के लिए, मैं एक 'कार्यक्षमता' बनाने के लिए 'लागू' पर 'बाइंडेबल 'का उपयोग कर सकता हूं जो एक समारोह' func' लेता है और 'func.apply' के बराबर एक और फ़ंक्शन देता है। इसके अलावा यह बस क्लीनर दिखता है। –

+0

@NagaJolokia ओह। मैं आपको अंतिम टिप्पणी में उल्लेख करना भूल गया था। स्पष्टीकरण के लिए –

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

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