2012-03-20 19 views

उत्तर

6

आप आंशिक कार्यों की तलाश में हैं, जो उपनामों के लिए सुविधाजनक शॉर्टेंड हैं।

var square = function (x) { 
    return Math.pow(x, 2); 
}; 

आंशिक कार्यों का उपयोग करना यह होगा:

"क्लासिक" जिस तरह से आप जो चाह रहे हैं करने के लिए के साथ है

var square = Math.pow.partial(undefined, 2); 
console.log(square(3)); 

दुर्भाग्य से, Function.prototype.partial किसी में नहीं दिया गया है ब्राउज़र।

/** 
* @dependencies 
* Array.prototype.slice 
* Function.prototype.call 
* 
* @return Function 
* returns the curried function with the provided arguments pre-populated 
*/ 
(function() { 
    "use strict"; 
    if (!Function.prototype.partial) { 
     Function.prototype.partial = function() { 
      var fn, 
       argmts; 
      fn = this; 
      argmts = arguments; 
      return function() { 
       var arg, 
        i, 
        args; 
       args = Array.prototype.slice.call(argmts); 
       for (i = arg = 0; i < args.length && arg < arguments.length; i++) { 
        if (typeof args[i] === 'undefined') { 
         args[i] = arguments[arg++]; 
        } 
       } 
       return fn.apply(this, args); 
      }; 
     }; 
    } 
}()); 
+0

मैंने पहले यह जवाब नहीं देखा था। यह वास्तव में सबसे अच्छा समाधान है। धन्यवाद। – MaiaVictor

+0

नीचे @ ब्रायन-एम-हंट उत्तर में 'partialRight() 'समाधान भी देखें – Offirmo

-1

क्या बुराई है:

var square = function(x) {return x*x;}; 

सवाल ठीक से जवाब देने के लिए, आप इस तरह के रूप में, एक गुमनाम समारोह एक सेट पैरामीटर के साथ "बाध्य" फ़ंक्शन को कॉल बनाने की जरूरत:

var square = function(x) {return Math.pow(x,2);}; 

इस तरह, आप किसी भी पैरामीटर को बाध्य कर सकते हैं, पैरामीटर को पुनर्व्यवस्थित कर सकते हैं, या दोनों के संयोजन को जोड़ सकते हैं। हालांकि ध्यान रखें कि प्रदर्शन पर कुछ प्रभाव पड़ता है, क्योंकि जब भी आप इस तरह बाध्य करते हैं तो स्टैक पर अतिरिक्त फ़ंक्शन कॉल जोड़ रहे हैं।

+1

क्या आपका मतलब यह है कि वह इस तथ्य को छोड़कर कि वह कुछ और मांग रहा है? – gdoron

+0

मुझे लगता है कि यह एक बुरा उदाहरण है, क्योंकि यह उत्तर दिए गए उदाहरण में समस्या को स्पष्ट रूप से हल करता है। –

+4

दिया गया उदाहरण हल करने का मामला नहीं था, यह केवल एक उदाहरण था ताकि आप समझ सकें कि मुझे क्या चाहिए। क्षमा करें, लेकिन यह ऐसा नहीं करेगा, भले ही इरादा अच्छा है। – MaiaVictor

11
Function.prototype.bindRight = function() { 
    var self = this, args = [].slice.call(arguments); 
    return function() { 
     return self.apply(this, [].slice.call(arguments).concat(args)); 
    }; 
}; 

var square = Math.pow.bindRight(2); 
square(3); //9 
+0

मैं वास्तव में मानक पुस्तकालय, या एक लोकप्रिय पुस्तकालय का उपयोग कर कार्यान्वयन की उम्मीद कर रहा था। ऐसा लगता है कि ऐसा नहीं है, हालांकि, यह सही जवाब है। धन्यवाद। – MaiaVictor

0

ऐसा लगता है कि आप आंशिक आवेदन चाहते हैं। ऐसे कई पुस्तकालय हैं जो अंडरस्कोर.जेएस सहित प्रदान करते हैं: http://documentcloud.github.com/underscore/

3

:


आप के लिए सौभाग्य से, मैं मैं क्या आवश्यक जावास्क्रिप्ट वस्तु उन्मुख काम करता है, तरीकों, कक्षाओं, आदि यह Function.prototype.partial.js है पर विचार का एक पुस्तकालय पर काम कर रहा है

 
This method is like _.partial except that partial arguments 
are appended to those provided to the new function. 

Arguments 
     func (Function): The function to partially apply arguments to. 
     [arg] (…*)  : Arguments to be partially applied. 
Returns  (Function): Returns the new partially applied function. 
0

आप 012 के साथ यह कर सकते हैं: Lodash के partialRight आप क्या चाहते हैं, और यहाँ क्या करेंगे प्रलेखन है, _ एक प्लेसहोल्डर के रूप में उत्तीर्ण होकर, भरे हुए को किया बाद में:

var square = _.partial(Math.pow, _, 2); 
console.log(square(3)); // => 9 

यह सुविधा फ़रवरी 2014 (रेखांकित 1.6.0) में दिखाई दिया।

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