ऐसे forEach
के रूप में JavaScript श्रृंखला तरीकों एक thisArg
पैरामीटर, जो कॉलबैक लागू करने के लिए संदर्भ के रूप में प्रयोग किया जाता है है:Array.prototype.reduce का यह ऑब्जेक्ट पैरामीटर क्यों नहीं है?
array.forEach(callback[, thisArg])
करते हैं every
, some
, filter
और map
। हालांकि, reduce
और reduceRight
कोई ऐसा पैरामीटर नहीं है। क्या इसके लिए कोई विशेष कारण है, या किसी कारण से यह जरूरी नहीं है?
उदाहरण के लिए, reduceRight
का उपयोग कर कार्यात्मक संरचना के निम्नलिखित कार्यान्वयन पर विचार करें:
function compose() {
var fns = [].slice.call(arguments,0);
return function result() {
return fns.reduceRight(
function (prev,cur){
return [cur.apply(this,prev)];
},
arguments
)[0];
};
}
मैं इस "इस अवगत" करना चाहते हैं, तो कार्यों की रचना की जा रही संदर्भ में कहा जाता है जो समारोह में compose
द्वारा लौटाया गया है। वर्तमान में वे वैश्विक वस्तु के संदर्भ में शामिल होने लगते हैं। मैं फंक्शन result
के शीर्ष पर पुराना var self=this;
कर सकता हूं, और इसे cur.apply
कॉल के पहले तर्क के रूप में उपयोग करता हूं, जहां वर्तमान में this
है, लेकिन reduce
ने thisArg
तर्क लिया तो यह अनावश्यक होगा।
क्या मुझे यहां कुछ याद आ रही है, और reduce
के बारे में कुछ ऐसा है जो इस अनावश्यक या अनुपयोगी बनाता है?
अद्यतन
@kangax हाँ, मुझे लगा कि। एपीआई के डिजाइन की आलोचना करने के लिए मुझसे दूर रहें, लेकिन reduce
के लिए हस्ताक्षर मेरे लिए थोड़ा अजीब लगता है। दूसरा वैकल्पिक तर्क सामान्य वैकल्पिक तर्कों से भिन्न रूप से कार्य करता है, जो आमतौर पर केवल एक डिफ़ॉल्ट मान होता है; इसके बजाय इसकी उपस्थिति या अनुपस्थिति व्यवहार को बदलती है, अनिवार्य रूप से हस्ताक्षर (तर्क गणना) के आधार पर फ़ंक्शन को अधिभारित करती है। जब दूसरा पैरामीटर अनुपस्थित है, तो सरणी का पहला तत्व प्रारंभिक मान बन जाता है और कॉलबैक के लिए पहला कॉल दूसरे मान के विरुद्ध होता है। मुझे ऐसा लगता है कि इस व्यवहार को आसानी से बस बुला
array.slice(1).reduce(fn,array[0])
मामले के लिए विशेष नियम जहां दूसरा तर्क छोड़ दिया जाता है, जो बारी में, यदि आपका अनुमान सही है, तो भी इसे बनाया में
बजाय इमारत ने अपनाया जा सकता है thisArg
तर्क निर्दिष्ट करने के लिए अनिवार्य रूप से असंभव है। फिर फिर, मुझे यकीन है कि इस तरह के मुद्दों पर पहले ही बहस की जा रही थी, जबकि इस तरह के दृष्टिकोण के लिए अच्छे कारण हो सकते थे।
शायद क्योंकि 'कमी' में दूसरा तर्क प्रारंभिक मान – kangax
है क्या आपको 'lowRight'' के साथ ऐसा करने का कोई कारण है? मुझे लगता है कि आप 'रिवर्स' डी ऐरे पर 'forEach' के साथ आसानी से ऐसा कर सकते हैं। संपादित करें: मुझे लगता है कि मेरा मुद्दा यह है कि आप कार्यों की सरणी को कम करने की तलाश नहीं कर रहे हैं, बल्कि कार्यों के माध्यम से इनपुट का एक सेट चलाएं। – tJener
@tJener बेशक आप इसे प्रत्येक के लिए कर सकते हैं (aserscore.js करता है), लेकिन मुझे कम/दाएं का उपयोग करने में एक निश्चित लालित्य मिला। –