क्या जावास्क्रिप्ट में एक फ़ंक्शन कॉल में नामित पैरामीटर प्रदान करने का एक तरीका है?


207

मुझे कुछ मामलों में C # में नामित पैरामीटर सुविधा काफी उपयोगी लगती है।

calculateBMI(70, height: 175);

यदि मैं जावास्क्रिप्ट में यह चाहूं तो मैं क्या उपयोग कर सकता हूं?


मुझे यह नहीं चाहिए:

myFunction({ param1: 70, param2: 175 });

function myFunction(params){
  // Check if params is an object
  // Check if the parameters I need are non-null
  // Blah blah
}

वह तरीका जो मैंने पहले ही इस्तेमाल कर लिया है। क्या कोई और तरीका है?

मैं ऐसा करने के लिए किसी भी पुस्तकालय का उपयोग कर रहा हूँ।


मुझे नहीं लगता कि यह संभव है, लेकिन आप खाली जगहों पर कुछ अपरिभाषित करने की कोशिश कर सकते हैं। जो रास्ता खराब है। वस्तु का उपयोग करें, इसका अच्छा।
व्लादिस्लाव Qulin

14
नहींं, जावास्क्रिप्ट / एक्मास्क्रिप्ट नामांकित मापदंडों का समर्थन नहीं करते हैं। माफ़ करना।
smilly92

1
मुझे पहले से यह पता है। धन्यवाद। मैं किसी ऐसे तरीके की तलाश कर रहा था, जिसमें शामिल करना कि Functionजावास्क्रिप्ट में मौजूदा क्या कर सकता है।
रॉबिन माबेन

1
Functionजावास्क्रिप्ट में मौजूदा जावास्क्रिप्ट का मुख्य सिंटैक्स नहीं बदल सकता है
गैरेथ

2
मुझे नहीं लगता कि जावास्क्रिप्ट इस सुविधा का समर्थन करता है। मुझे लगता है कि आप नामांकित मापदंडों के सबसे करीब आ सकते हैं (1) एक टिप्पणी जोड़ें calculateBMI(70, /*height:*/ 175);, (2) एक वस्तु प्रदान करें calculateBMI(70, {height: 175}), या (3) एक निरंतर उपयोग करें const height = 175; calculateBMI(70, height);
tfmontague

जवाबों:


211

ES2015 और बाद में

ES2015 में, नामांकित मापदंडों को अनुकरण करने के लिए पैरामीटर विनाशकारी का उपयोग किया जा सकता है। किसी ऑब्जेक्ट को पास करने के लिए कॉल करने वाले की आवश्यकता होगी, लेकिन यदि आप डिफ़ॉल्ट पैरामीटर का उपयोग करते हैं, तो आप फ़ंक्शन के सभी चेक से बच सकते हैं:

myFunction({ param1 : 70, param2 : 175});

function myFunction({param1, param2}={}){
  // ...function body...
}

// Or with defaults, 
function myFunc({
  name = 'Default user',
  age = 'N/A'
}={}) {
  // ...function body...
}

ES5

आप जो चाहते हैं, उसके करीब आने का एक तरीका है, लेकिन यह Function.prototype.toString [ES5] के आउटपुट पर आधारित है , जो कार्यान्वयन के लिए कुछ हद तक निर्भर है, इसलिए यह क्रॉस-ब्राउज़र संगत नहीं हो सकता है।

फ़ंक्शन के स्ट्रिंग प्रतिनिधित्व से पैरामीटर नामों को पार्स करने का विचार है ताकि आप किसी ऑब्जेक्ट के गुणों को संबंधित पैरामीटर के साथ जोड़ सकें।

एक फ़ंक्शन कॉल तब दिख सकता है

func(a, b, {someArg: ..., someOtherArg: ...});

जहां aऔर bतर्कपूर्ण तर्क हैं और अंतिम तर्क नामित तर्क के साथ एक वस्तु है।

उदाहरण के लिए:

var parameterfy = (function() {
    var pattern = /function[^(]*\(([^)]*)\)/;

    return function(func) {
        // fails horribly for parameterless functions ;)
        var args = func.toString().match(pattern)[1].split(/,\s*/);

        return function() {
            var named_params = arguments[arguments.length - 1];
            if (typeof named_params === 'object') {
                var params = [].slice.call(arguments, 0, -1);
                if (params.length < args.length) {
                    for (var i = params.length, l = args.length; i < l; i++) {
                        params.push(named_params[args[i]]);
                    }
                    return func.apply(this, params);
                }
            }
            return func.apply(null, arguments);
        };
    };
}());

जिसे आप निम्न के रूप में उपयोग करेंगे:

var foo = parameterfy(function(a, b, c) {
    console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);     
});

foo(1, 2, 3); // a is 1  | b is 2  | c is 3
foo(1, {b:2, c:3}); // a is 1  | b is 2  | c is 3
foo(1, {c:3}); // a is 1  | b is undefined  | c is 3
foo({a: 1, c:3}); // a is 1  | b is undefined  | c is 3 

डेमो

इस दृष्टिकोण में कुछ कमियां हैं (आपको चेतावनी दी गई है!):

  • यदि अंतिम तर्क एक वस्तु है, तो इसे "नामित तर्क ऑब्जेक्ट" के रूप में माना जाता है
  • आपको फ़ंक्शन में परिभाषित करने के लिए हमेशा उतने ही तर्क मिलेंगे, लेकिन उनमें से कुछ का मूल्य हो सकता है undefined(यह सभी के लिए कोई मूल्य नहीं होने से अलग है)। इसका मतलब है कि आप यह arguments.lengthपरीक्षण करने के लिए उपयोग नहीं कर सकते कि कितने तर्क पारित किए गए हैं।

रैपर बनाने वाले फ़ंक्शन के बजाय, आपके पास एक फ़ंक्शन भी हो सकता है जो फ़ंक्शन और विभिन्न मानों को तर्क के रूप में स्वीकार करता है, जैसे कि

call(func, a, b, {posArg: ... });

या यहां तक ​​कि विस्तार करें Function.prototypeताकि आप कर सकें:

foo.execute(a, b, {posArg: ...});

: हाँ ... यहाँ उस के लिए एक उदाहरण है jsfiddle.net/9U328/1 (हालांकि आप बल्कि का उपयोग करना चाहिए Object.definePropertyऔर सेट enumerableकरने के लिए false)। देशी वस्तुओं का विस्तार करते समय हमेशा सावधानी बरतनी चाहिए। पूरे दृष्टिकोण को थोड़ा हैकिंग महसूस होता है, इसलिए मैं इसे अभी और हमेशा के लिए काम करने की उम्मीद नहीं करूंगा;)
फेलिक्स क्लिंग

का उल्लेख किया। मैं इसे इस्तेमाल करने के लिए नीचे लाऊंगा। जवाब के रूप में चिह्नित! ... अभी के लिए;)
रॉबिन माबेन

1
बहुत मामूली न्यूपिक: मुझे नहीं लगता कि यह दृष्टिकोण एक्मास्क्रिप्ट 6 एरो फ़ंक्शंस को पकड़ेगा । वर्तमान में एक बड़ी चिंता का विषय नहीं है, लेकिन आपके उत्तर के कैविटीज़ अनुभाग में ध्यान देने योग्य हो सकता है।
कोई नहीं

3
@ कोई नहीं: सच्चा। तीर के काम करने से पहले मैंने यह जवाब लिखा था। ES6 में, मैं वास्तव में विनाशकारी पैरामीटर का सहारा लूंगा।
फेलिक्स क्लिंग

1
undefinedबनाम "कोई मूल्य नहीं" के मुद्दे पर , यह जोड़ा जा सकता है कि यह ठीक उसी तरह है जैसे जेएस फ़ंक्शन के डिफ़ॉल्ट मान काम कर रहे हैं - undefinedएक लापता मान के रूप में।
दिमित्री ज़ैतसेव

71

नहीं - वस्तु दृष्टिकोण इस पर जावास्क्रिप्ट का जवाब है। इससे कोई समस्या नहीं है बशर्ते आपका फ़ंक्शन अलग-अलग पैरामेट्स के बजाय किसी ऑब्जेक्ट की अपेक्षा करता है।


35
@RobertMaben - पूछे गए विशिष्ट प्रश्न का उत्तर यह है कि किसी विशेष नाम स्थान पर रहते हुए बिना घोषित संस्करण या कार्यों को एकत्र करने का कोई मूल तरीका नहीं है। सिर्फ इसलिए कि उत्तर छोटा है, यह उत्तर के रूप में इसकी उपयुक्तता को नकारता नहीं है - क्या आप सहमत नहीं होंगे? "नो, नो टी संभव" की तर्ज पर, वहाँ बहुत कम उत्तर हैं। लघु वे हो सकते हैं, लेकिन वे प्रश्न का उत्तर भी हैं।
Mitya

3
आजकल es6 हालांकि है: 2ality.com/2011/11/keyword-parameters.html
slacktracer

1
यह निश्चित रूप से एक उचित जवाब है - 'नामित पैरामीटर' एक भाषा विशेषता है। इस तरह की सुविधा के अभाव में वस्तु दृष्टिकोण अगली सबसे अच्छी बात है।
फतुहोकू

32

यह मुद्दा कुछ समय के लिए मेरा एक पालतू जानवर है। मैं अपने बेल्ट के तहत कई भाषाओं वाला अनुभवी प्रोग्रामर हूं। मेरी पसंदीदा भाषाओं में से एक है जिसे मुझे इस्तेमाल करने में खुशी मिली है वह है पायथन। पायथन बिना किसी चालबाजी के नामित मापदंडों का समर्थन करता है .... जब से मैंने पायथन (कुछ समय पहले) का उपयोग करना शुरू किया, सब कुछ आसान हो गया। मेरा मानना ​​है कि हर भाषा को नामांकित मापदंडों का समर्थन करना चाहिए, लेकिन यह सिर्फ मामला नहीं है।

लूत के लोगों का कहना है कि "पास ए ऑब्जेक्ट" ट्रिक का उपयोग करें ताकि आपने मापदंडों का नाम दिया हो।

/**
 * My Function
 *
 * @param {Object} arg1 Named arguments
 */
function myFunc(arg1) { }

myFunc({ param1 : 70, param2 : 175});

और यह बढ़िया काम करता है, सिवाय ..... जब यह सबसे अधिक आईडीई के लिए आता है, तो हम में से बहुत से डेवलपर्स हमारी आईडीई के भीतर टाइप / तर्क संकेत पर भरोसा करते हैं। मैं व्यक्तिगत रूप से PHP स्टॉर्म का उपयोग करता हूं (अन्य जेटब्रेन आईडीई के साथ-साथ अजगर के लिए अजगर और ऑब्जेक्ट सी के लिए ऐपकोड)

और "पास ए ऑब्जेक्ट" ट्रिक का उपयोग करने के साथ सबसे बड़ी समस्या यह है कि जब आप फ़ंक्शन को कॉल कर रहे हैं, तो आईडीई आपको एक ही प्रकार का संकेत देता है और यह है ... हमें कैसे पता होना चाहिए कि पैरामीटर और प्रकार क्या होने चाहिए। arg1 वस्तु?

मुझे पता नहीं है कि arg1 में कौन से पैरामीटर जाने चाहिए

इसलिए ... "पास ए ऑब्जेक्ट" चाल मेरे लिए काम नहीं करती है ... यह वास्तव में अधिक फ़ंक्शन का कारण बनता है जिसके साथ प्रत्येक फ़ंक्शन के डॉकब्लॉक को देखने से पहले मुझे पता है कि फ़ंक्शन क्या अपेक्षा करता है .... ज़रूर, यह बहुत अच्छा है जब आप मौजूदा कोड बनाए रख रहे हैं, लेकिन नए कोड लिखने के लिए यह भयानक है।

खैर, यह वह तकनीक है जिसका मैं उपयोग करता हूं .... अब, इसके साथ कुछ समस्याएं हो सकती हैं, और कुछ डेवलपर्स मुझे बता सकते हैं कि मैं इसे गलत कर रहा हूं, और मेरे पास इन चीजों के बारे में एक खुला दिमाग है ... मैं हमेशा एक कार्य को पूरा करने के बेहतर तरीकों को देखने के लिए तैयार हूं ... इसलिए, अगर इस तकनीक के साथ कोई समस्या है, तो टिप्पणियों का स्वागत है।

/**
 * My Function
 *
 * @param {string} arg1 Argument 1
 * @param {string} arg2 Argument 2
 */
function myFunc(arg1, arg2) { }

var arg1, arg2;
myFunc(arg1='Param1', arg2='Param2');

इस तरह, मेरे पास दोनों दुनिया के सर्वश्रेष्ठ हैं ... नया कोड लिखना आसान है क्योंकि मेरी आईडीई मुझे सभी उचित तर्क संकेत देती है ... और, बाद में कोड बनाए रखते हुए, मैं एक नज़र में देख सकता हूं, न केवल मान फ़ंक्शन में गया, लेकिन तर्क का नाम भी। एकमात्र ओवरहेड जो मैं देख रहा हूं, वह वैश्विक नाम स्थान को प्रदूषित करने से बचाने के लिए आपके तर्क नामों को स्थानीय चर के रूप में घोषित कर रहा है। निश्चित रूप से, यह थोड़ा अतिरिक्त टाइपिंग है, लेकिन नए कोड लिखते समय या मौजूदा कोड को बनाए रखते हुए डॉकब्लॉक देखने में लगने वाले समय की तुलना में तुच्छ।

अब, नया कोड बनाते समय मेरे पास सभी पैरामीटर और प्रकार हैं


2
इस तकनीक के साथ एक ही बात यह है कि आप मापदंडों के क्रम को बदल नहीं सकते हैं ... हालांकि मैं व्यक्तिगत रूप से ठीक हूं।
रे पेरा

13
ऐसा लगता है कि बस कुछ परेशानी हो रही है जब कुछ भविष्य के अनुचर के साथ आता है और सोचता है कि वे तर्क क्रम को बदल सकते हैं (लेकिन स्पष्ट रूप से नहीं कर सकते हैं)।
कोई भी

1
@AndrewMedico मैं सहमत हूं ... ऐसा लगता है कि आप पाइथन की तरह तर्क क्रम बदल सकते हैं। केवल एक चीज मैं इस बारे में कह सकता हूं कि वे तर्क को बदलते हुए प्रोग्राम को तोड़ने पर वास्तविक त्वरित पता लगा लेंगे।
रे पेरिया

7
मैं तर्क देता हूं कि इससे myFunc(/*arg1*/ 'Param1', /*arg2*/ 'Param2');बेहतर है myFunc(arg1='Param1', arg2='Param2');, क्योंकि इससे पाठक को बरगलाए जाने का कोई मौका नहीं है, किसी भी वास्तविक नामित तर्क से हो रहा है
एरिक

2
प्रस्तावित पैटर्न का नाम तर्कों से कोई लेना-देना नहीं है, आदेश अभी भी मायने रखता है, नामों को वास्तविक मापदंडों के साथ सिंक में रहने की आवश्यकता नहीं है, नाम स्थान अनावश्यक चर के साथ प्रदूषित है और रिश्तों को निहित नहीं है।
दिमित्री जैतसेव

25

यदि आप यह स्पष्ट करना चाहते हैं कि केवल कॉल करने के बजाय प्रत्येक पैरामीटर क्या हैं

someFunction(70, 115);

निम्नलिखित क्यों नहीं

var width = 70, height = 115;
someFunction(width, height);

यकीन है, यह कोड की एक अतिरिक्त पंक्ति है, लेकिन यह पठनीयता पर जीतता है।


5
KISS सिद्धांत का पालन के लिए +1, प्लस यह भी डिबगिंग के साथ मदद करता है। हालांकि, मुझे लगता है कि प्रत्येक संस्करण को अपनी स्वयं की लाइन पर होना चाहिए, भले ही एक मामूली प्रदर्शन हिट ( http://stackoverflow.com/questions/9672635/javascript-var-statement-and-performance ) के साथ।
क्लेयरेस्ट्रेब

21
यह केवल कोड की अतिरिक्त पंक्ति के बारे में नहीं है, यह तर्कों के क्रम और उन्हें वैकल्पिक बनाने के बारे में भी है। इसलिए आप इसे नामित मापदंडों के साथ लिख सकते हैं: someFunction(height: 115);लेकिन यदि आप लिखते someFunction(height);हैं तो आप वास्तव में चौड़ाई निर्धारित कर रहे हैं।
फ्रांसिस्को प्रेसेनिया

उस स्थिति में, CoffeeScript नामांकित तर्कों का समर्थन करता है। यह आपको बस लिखने देगा someFunction(width = 70, height = 115);। जावास्क्रिप्ट कोड जो उत्पन्न होता है उसमें मौजूदा दायरे के शीर्ष पर घोषित किया जाता है।
ऑडुन ऑलसेन

6

एक अन्य तरीका उपयुक्त वस्तु की विशेषताओं का उपयोग करना होगा, जैसे कि:

function plus(a,b) { return a+b; };

Plus = { a: function(x) { return { b: function(y) { return plus(x,y) }}}, 
         b: function(y) { return { a: function(x) { return plus(x,y) }}}};

sum = Plus.a(3).b(5);

बेशक इस बने उदाहरण के लिए यह कुछ हद तक निरर्थक है। लेकिन उन मामलों में जहां फ़ंक्शन दिखता है

do_something(some_connection_handle, some_context_parameter, some_value)

यह अधिक उपयोगी हो सकता है। यह एक सामान्य फ़ंक्शन में इस तरह के ऑब्जेक्ट को मौजूदा फ़ंक्शन से बनाने के लिए "पैरामीटरफाइ" विचार के साथ जोड़ा जा सकता है। यह प्रत्येक पैरामीटर के लिए है जो एक सदस्य का निर्माण करेगा जो फ़ंक्शन के आंशिक मूल्यांकन किए गए संस्करण का मूल्यांकन कर सकता है।

यह विचार स्कोनिंकलिंग उर्फ ​​करींग से संबंधित है।


यह एक साफ विचार है, और यह और भी बेहतर हो जाता है अगर आप इसे तर्क आत्मनिरीक्षण के साथ जोड़ दें। दुर्भाग्य से, यह वैकल्पिक तर्कों के साथ काम करने से कम हो जाता है
एरिक

2

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

हालांकि व्यवहार में मुझे नहीं लगता कि यह आपके द्वारा पहले से इस्तेमाल की जा रही तकनीक से परे कोई कार्यात्मक मूल्य प्रदान करता है, यह शब्दार्थ से थोड़ा साफ है। और यह अभी भी एक वस्तु संदर्भ या एक वस्तु शाब्दिक पारित करने की आवश्यकता है।

function sum({ a:a, b:b}) {
    console.log(a+'+'+b);
    if(a==undefined) a=0;
    if(b==undefined) b=0;
    return (a+b);
}

// will work (returns 9 and 3 respectively)
console.log(sum({a:4,b:5}));
console.log(sum({a:3}));

// will not work (returns 0)
console.log(sum(4,5));
console.log(sum(4));

2

Node-6.4.0 (process.versions.v8 = '5.0.71.60') और Node Chakracore-v7.0.0-pre8 और फिर Chrome-52 (V8 = 5.2.361.49) की कोशिश कर रहा हूं, मैंने देखा है कि इन मापदंडों का नाम लगभग है। लागू किया गया है, लेकिन उस आदेश में अभी भी पूर्वता है। मुझे नहीं लगता कि ECMA मानक क्या कहता है।

>function f(a=1, b=2){ console.log(`a=${a} + b=${b} = ${a+b}`) }

> f()
a=1 + b=2 = 3
> f(a=5)
a=5 + b=2 = 7
> f(a=7, b=10)
a=7 + b=10 = 17

लेकिन आदेश की आवश्यकता है !! क्या यह मानक व्यवहार है?

> f(b=10)
a=10 + b=2 = 12

10
आप जैसा सोचते हैं वैसा नहीं कर रहे हैं। b=10अभिव्यक्ति का परिणाम है 10, और यही वह है जो फ़ंक्शन को पास करता है। f(bla=10)यह भी काम करेगा (यह चर को 10 असाइन करता है blaऔर बाद में फ़ंक्शन को मान देता है)।
मथायस केस्टेनहोलज़

1
यह साइड-इफ़ेक्ट के रूप में ग्लोबल स्कोप में भी बना रहा है aऔर bवैरिएबल है।
गेरशोम

2

fनामित मापदंडों के साथ कॉलिंग फ़ंक्शन ऑब्जेक्ट के रूप में पारित हुआ

o = {height: 1, width: 5, ...}

मूल रूप से इसकी संरचना को बुला f(...g(o))रहा है जहां मैं प्रसार सिंटैक्स का उपयोग कर रहा हूं और gऑब्जेक्ट पैरामीटर को उनके पैरामीटर पदों के साथ जोड़ने वाला "बाइंडिंग" नक्शा है।

बाइंडिंग मैप ठीक गायब घटक है, जिसे इसकी कुंजियों के सरणी द्वारा दर्शाया जा सकता है:

// map 'height' to the first and 'width' to the second param
binding = ['height', 'width']

// take binding and arg object and return aray of args
withNamed = (bnd, o) => bnd.map(param => o[param])

// call f with named args via binding
f(...withNamed(binding, {hight: 1, width: 5}))

तीन डिकम्पोज्ड अवयवों पर ध्यान दें : फ़ंक्शन, नामित तर्कों और बंधन के साथ ऑब्जेक्ट। यह डिकूपलिंग इस निर्माण का उपयोग करने के लिए बहुत सारे लचीलेपन की अनुमति देता है, जहां बंधन को मनमाने ढंग से फ़ंक्शन की परिभाषा में अनुकूलित किया जा सकता है और फ़ंक्शन कॉल समय पर मनमाने ढंग से बढ़ाया जा सकता है।

उदाहरण के लिए, आप को संक्षिप्त कर सकते हैं heightऔर widthके रूप में hऔर wअपने कार्य की परिभाषा के अंदर, यह छोटे और क्लीनर बनाने के लिए, आप अभी भी स्पष्टता के लिए पूरा नाम से कॉल करने के लिए चाहते हैं, जबकि:

// use short params
f = (h, w) => ...

// modify f to be called with named args
ff = o => f(...withNamed(['height', 'width'], o))

// now call with real more descriptive names
ff({height: 1, width: 5})

यह लचीलापन कार्यात्मक प्रोग्रामिंग के लिए भी अधिक उपयोगी है, जहां फ़ंक्शंस को मूल रूप से उनके मूल परम नामों के साथ बदल दिया जा सकता है।


0

पाइथन से आकर इसने मुझे पीछे छोड़ दिया। मैंने नोड के लिए एक साधारण आवरण / प्रॉक्सी लिखा है जो स्थिति और कीवर्ड दोनों वस्तुओं को स्वीकार करेगा।

https://github.com/vinces1979/node-def/blob/master/README.md


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

@DmitriZaitsev: पायथन समुदाय में (कीवर्ड तर्क रोजमर्रा की सुविधा होने के साथ), हम इसे उपयोगकर्ताओं द्वारा कीवर्ड द्वारा वैकल्पिक तर्क निर्दिष्ट करने में सक्षम होने के लिए एक बहुत अच्छा विचार मानते हैं ; यह त्रुटियों से बचने में मदद करता है।
तोबियास

@Tobias जेएस में ऐसा करने वाले उपयोगकर्ताओं को एक हल समस्या है: f(x, opt)जहां optएक वस्तु है। चाहे वह त्रुटियों से बचने या बनाने में मदद करता हो (जैसे कि गलत वर्तनी और कीवर्ड नामों को याद करने के लिए दर्द)।
दिमित्री ज़ैतसेव

@DmitriZaitsev: पायथन में यह कड़ाई से त्रुटियों से बचा जाता है , क्योंकि (बेशक) कीवर्ड तर्क एक मुख्य भाषा सुविधा है। कुंजीशब्द- के लिए केवल तर्क, अजगर 3 है विशेष सिंटेक्स (जबकि अजगर 2 में आप से चाबी पॉप जाएगा kwargs dict एक के बाद एक और अंत में एक उठाना TypeErrorअगर अज्ञात कुंजी छोड़ दिया जाता है)। आपका f(x, opt)समाधान फ़ंक्शन को अजगर 2 की तरह कुछ करने की अनुमति देता है f, लेकिन आपको स्वयं सभी डिफ़ॉल्ट मानों को संभालने की आवश्यकता होगी।
टॉबी

@ टोबियास यह प्रस्ताव जेएस के लिए प्रासंगिक है? यह वर्णन करने के लिए लगता है कि कैसे f(x, opt)पहले से ही काम कर रहा है, जबकि मैं यह नहीं देखता कि यह सवाल का जवाब देने में कैसे मदद करता है, जैसे कि आप दोनों को कैसे करना चाहते हैं request(url)और request({url: url})यह urlकेवल कीवर्ड-केवल पैरामीटर बनाने से संभव नहीं होगा ।
दिमित्री जैतसेव

-1

आमतौर पर जो माना जाता है, उसके विपरीत, नामित पैरामीटर मानक, पुराने-स्कूल जावास्क्रिप्ट (केवल बूलियन मापदंडों के लिए) को एक सरल, स्वच्छ कोडिंग सम्मेलन के माध्यम से लागू किया जा सकता है, जैसा कि नीचे दिखाया गया है।

function f(p1=true, p2=false) {
    ...
}

f(!!"p1"==false, !!"p2"==true); // call f(p1=false, p2=true)

चेतावनियां:

  • तर्कों के आदेश को संरक्षित किया जाना चाहिए - लेकिन पैटर्न अभी भी उपयोगी है, क्योंकि यह स्पष्ट करता है कि कौन सा वास्तविक तर्क है, जिसके लिए औपचारिक पैरामीटर फ़ंक्शन हस्ताक्षर के लिए grep किए बिना या आईडीई का उपयोग करना है।

  • यह केवल बूलियंस के लिए काम करता है। हालाँकि, मुझे यकीन है कि जावास्क्रिप्ट के अद्वितीय प्रकार के शब्दार्थ शब्दार्थ का उपयोग करके अन्य प्रकारों के लिए एक समान पैटर्न विकसित किया जा सकता है।


आप अभी भी स्थिति का उल्लेख कर रहे हैं, यहां नाम से नहीं।
दिमित्री जैतसेव

@DmitriZaitsev हाँ, मैंने भी इतना ऊपर कहा। हालाँकि, नामित तर्कों का उद्देश्य पाठक को यह स्पष्ट करना है कि प्रत्येक तर्क का अर्थ क्या है; यह प्रलेखन का एक रूप है। मेरा समाधान टिप्पणियों को सहारा दिए बिना फ़ंक्शन कॉल के भीतर प्रलेखन को सक्षम करने में सक्षम बनाता है, जो अस्वच्छ दिखते हैं।
user234461

यह एक अलग समस्या हल करता है। सवाल heightपरम आदेश के बावजूद नाम से गुजरने का था ।
दिमित्री ज़ैतसेव

@DmitriZaitsev वास्तव में, सवाल पैरामीटर आदेश के बारे में कुछ भी नहीं कहा, या क्यों ओपी नामित params का उपयोग करना चाहता था।
user234461

यह C # का संदर्भ देता है, जहां किसी भी क्रम में नाम से पारित होने वाली कुंजी है।
दिमित्री जैतसेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.