জাভাস্ক্রিপ্টে কোনও ফাংশন কলের নামকরণের পরামিতি সরবরাহ করার কোনও উপায় আছে কি?


207

আমি সি # তে নামযুক্ত প্যারামিটার বৈশিষ্ট্যটি বেশ কয়েকটি ক্ষেত্রে বেশ দরকারী।

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
}

এই পদ্ধতির আমি ইতিমধ্যে ব্যবহার করেছি। অন্য উপায় আছে?

এটি করার জন্য আমি কোনও গ্রন্থাগার ব্যবহার করছি okay


আমি মনে করি এটি সম্ভব, তবে আপনি খালি জায়গায় কিছু অপরিজ্ঞাত রাখার চেষ্টা করতে পারেন। কোন দিক থেকে খারাপ। বস্তুটি ব্যবহার করুন, এটি ভাল।
ভ্লাদিস্লাভ কুলিন

14
নাপ, জাভাস্ক্রিপ্ট / ইকামাস্ক্রিপ্ট নামের প্যারামিটারগুলি সমর্থন করে না। দুঃখিত।
স্মিলি

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
@ রবার্টমাবেন - জিজ্ঞাসা করা নির্দিষ্ট প্রশ্নের উত্তর হ'ল ঘোষিত যুদ্ধ বা ফাংশন সংগ্রহ করার কোনও নেটিভ উপায় নেই যে তারা নির্দিষ্ট নামস্থানে বাস করে না জেনে। উত্তরটি সংক্ষিপ্ত হওয়ার কারণে, এটি উত্তর হিসাবে এর উপযুক্ততাকে অস্বীকার করে না - আপনি কি রাজি হবেন না? "না, কোনও সম্ভাব্যতা নেই" এর পংক্তিতে অনেকগুলি ছোট উত্তর রয়েছে। সংক্ষিপ্ত তারা হতে পারে, তবে তারা প্রশ্নের উত্তরও বটে।
মিত্য

3
আজকাল এসআই আছে যদিও: 2ality.com/2011/11/keyword-paraters.html
স্ল্যাকট্রেসার

1
এটি অবশ্যই একটি উপযুক্ত উত্তর - 'নামকরণের প্যারামিটারগুলি' একটি ভাষা বৈশিষ্ট্য। এই জাতীয় বৈশিষ্ট্যের অভাবে অবজেক্ট অ্যাপ্রোচ হ'ল পরের সেরা জিনিস।
ফতুহোকু

32

এই সমস্যাটি কিছু সময়ের জন্য আমার একটি পোষা প্রাণীরূপ been আমি আমার বেল্টের নীচে অনেক ভাষা নিয়ে একটি পাকা প্রোগ্রামার। আমার পছন্দের ভাষাগুলির মধ্যে একটি পাইথনটি ব্যবহার করে আমার আনন্দ হয়েছে। পাইথন কোনও কৌশল ছাড়াই নামযুক্ত প্যারামিটার সমর্থন করে .... যেহেতু আমি পাইথন ব্যবহার শুরু করেছি (কিছুকাল আগে) সবকিছু সহজ হয়ে গেছে। আমি বিশ্বাস করি যে প্রতিটি ভাষার নামকরণের প্যারামিটারগুলি সমর্থন করা উচিত, তবে এটি ঠিক এটি নয়।

লোটের লোকেরা কেবল "একটি বস্তু পাস" কৌশলটি ব্যবহার করতে বলে যাতে আপনার পরামিতিগুলির নাম দেওয়া হয়েছে।

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

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

এবং এটি দুর্দান্ত কাজ করে ..... বাদে যখন বেশিরভাগ আইডিই এর কথা আসে তখন আমাদের প্রচুর বিকাশকারীরা আমাদের আইডিই-র মধ্যে টাইপ / আর্গুমেন্টের ইঙ্গিতগুলিতে নির্ভর করে। আমি ব্যক্তিগতভাবে পিএইচপি স্টর্ম ব্যবহার করি (পাইথর্মের জন্য পাইচার্মের মতো অন্যান্য জেটব্রেইন আইডিইগুলির সাথে এবং উদ্দেশ্য সি এর জন্য অ্যাপকোড)

এবং "একটি বস্তুটি পাস করুন" কৌশলটি ব্যবহার করে সবচেয়ে বড় সমস্যাটি হ'ল আপনি যখন ফাংশনটি কল করছেন তখন আইডিই আপনাকে একটি একক প্রকারের ইঙ্গিত দেয় এবং এটিই ... কী পরামিতি এবং প্রকারগুলি অবশ্যই প্রবেশ করবে তা আমাদের কীভাবে অনুমান করা উচিত? আরজি 1 অবজেক্ট?

আরজি 1 এ কোন পরামিতিগুলি করা উচিত তা আমার কোনও ধারণা নেই

সুতরাং ... "একটি বস্তু পাস" কৌশলটি আমার পক্ষে কাজ করে না ... ফাংশনটি কী পরামিতিগুলি প্রত্যাশা করে তা জানার আগে এটি প্রতিটি ফাংশনের ডকব্লকটি দেখার সাথে আরও মাথা ব্যথার কারণ হয় .... অবশ্যই, এটি দুর্দান্ত আপনি যখন বিদ্যমান কোড বজায় রাখছেন তবে নতুন কোড লেখার জন্য এটি ভয়াবহ।

ঠিক আছে, এটি আমি ব্যবহার করি কৌশলটি .... এখন, এটিতে কিছু সমস্যা থাকতে পারে এবং কিছু বিকাশকারীরা আমাকে বলতে পারে যে আমি এটি ভুল করছি, এবং যখন এই জিনিসগুলি আসে তখন আমার মন খোলা থাকে ... আমি কোনও কাজ সম্পাদনের আরও ভাল উপায়গুলি দেখতে সর্বদা আগ্রহী ... সুতরাং, যদি এই কৌশলটি নিয়ে কোনও সমস্যা হয়, তবে মন্তব্যগুলি স্বাগত।

/**
 * 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
@ অ্যান্ড্রুমেডিকো আমি একমত ... এটি দেখে মনে হচ্ছে আপনি পাইথনের মতো যুক্তি আদেশটি পরিবর্তন করতে পারেন। আমি কেবল এটিই বলতে পারি যে তারা যুক্তি ক্রম পরিবর্তন করার সাথে সাথে প্রোগ্রামটি ভেঙে দেওয়ার সময় আসল দ্রুত সন্ধান করবে।
রে পেরে

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
এটি কেবলমাত্র কোডের অতিরিক্ত লাইন সম্পর্কে নয়, এটি আর্গুমেন্টের ক্রম এবং এগুলি alচ্ছিক করে তোলার বিষয়েও। সুতরাং আপনি নামযুক্ত পরামিতিগুলি সহ এটি লিখতে someFunction(height: 115);পারেন : তবে আপনি যদি লিখেন তবে আপনি someFunction(height);প্রস্থটি নির্ধারণ করছেন setting
ফ্রান্সিসকো প্রেজেনসিয়া

সেক্ষেত্রে কফিস্ক্রিপ্ট নামযুক্ত তর্কগুলি সমর্থন করে। এটি আপনাকে ঠিক লিখতে দেবে 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

নোড -6.4.0 (process.versions.v8 = '5.0.71.60') এবং নোড চক্রাকোর-v7.0.0-pre8 এবং তারপরে Chrome-52 (V8 = 5.2.361.49) চেষ্টা করে দেখেছি যে নামকরণ পরামিতিগুলি প্রায় বাস্তবায়িত হয়েছে, কিন্তু সেই আদেশটির এখনও প্রাধান্য রয়েছে। ইসিএমএ স্ট্যান্ডার্ড কী বলে আমি তা পাই না।

>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}))

তিনটি decoupled উপাদান নোট করুন : ফাংশন, নামযুক্ত আর্গুমেন্ট এবং বাইন্ডিং সহ বস্তু। এই ডিউপলিংটি এই নির্মাণটি ব্যবহার করার জন্য অনেক নমনীয়তার সুযোগ দেয়, যেখানে বাঁধাইটি নির্ধারিতভাবে ফাংশনের সংজ্ঞা অনুসারে কাস্টমাইজ করা যায় এবং ফাংশন কল সময়ে নির্বিচারে প্রসারিত করা যেতে পারে।

উদাহরণস্বরূপ, আপনি সংক্ষিপ্ত আকারে 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


যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনার সমাধানটির জন্য ফাংশনটির সংজ্ঞায় অবস্থানিক এবং নামযুক্ত প্যারামগুলির মধ্যে পার্থক্য করা দরকার, যার অর্থ কল সময়ে আমার এই পছন্দটি করার স্বাধীনতা নেই।
দিমিত্রি জায়তসেভ

@ দিমিত্রিজেটসেভ: পাইথন সম্প্রদায়ের (কীওয়ার্ড আর্গুমেন্ট একটি নিত্যনতুন বৈশিষ্ট্য হিসাবে), আমরা কীওয়ার্ড দ্বারা usersচ্ছিক যুক্তিগুলি ব্যবহারকারীদের বাধ্য করতে সক্ষম হওয়াকে খুব ভাল ধারণা বলে বিবেচনা করি ; এটি ত্রুটিগুলি এড়াতে সহায়তা করে।
টোবিয়াস

@ টোবিয়াস ব্যবহারকারীদের জেএসে এইভাবে বাধ্য করা একটি সমাধানযোগ্য সমস্যা:, f(x, opt)যেখানে optকোনও বিষয়। এটি ত্রুটিগুলি এড়াতে বা তৈরি করতে সহায়তা করে (যেমন ভুল বানানের কারণে ঘটে এবং কীওয়ার্ডের নামগুলি মনে রাখার জন্য ব্যথা হয়) একটি প্রশ্ন থেকে যায়।
দিমিত্রি জইতসেভ

@ দিমিত্রিজাইটসেভ: পাইথনে এটি ত্রুটিগুলি কঠোরভাবে এড়িয়ে চলে , কারণ (অবশ্যই) মূল শব্দটির যুক্তিগুলি সেখানে মূল ভাষার বৈশিষ্ট্য। কীওয়ার্ড- কেবল যুক্তিগুলির জন্য, পাইথন 3 এর একটি বিশেষ বাক্য গঠন রয়েছে (যখন পাইথন 2 এ আপনি kwargs ডিক থেকে একের পর এক কীগুলি পপ করবেন এবং শেষ পর্যন্ত TypeErrorঅজানা কীগুলি রেখে গেলে একটি উত্থাপন করবেন )। তোমার f(x, opt)সমাধান পারবেনf পাইথন 2 ভালো কিছু করতে ফাংশন, কিন্তু আপনি সব ডিফল্ট মান নিজেকে হ্যান্ডেল করার প্রয়োজন হবে।
টোবিয়াস

@ টোবিয়াস কি এই প্রস্তাবটি জেএসের জন্য প্রাসঙ্গিক? এটি 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)

আদেশ সহকারে:

  • আর্গুমেন্টগুলির অর্ডারিং অবশ্যই সংরক্ষণ করতে হবে - তবে প্যাটার্নটি এখনও কার্যকর since

  • এটি কেবল বুলিয়ানদের জন্য কাজ করে। তবে আমি নিশ্চিত যে জাভাস্ক্রিপ্টের অনন্য প্রকারের জবরদস্তি শব্দার্থক শব্দ ব্যবহার করে অন্য ধরণের ক্ষেত্রেও একই ধরণের নকশা তৈরি করা যেতে পারে।


আপনি এখনও অবস্থান দ্বারা উল্লেখ করছেন, এখানে নাম দ্বারা নয়।
দিমিত্রি জায়তসেভ

@ দিমিত্রিজাইতসেভ হ্যাঁ, আমি এমনকি উপরেও বলেছি। তবে নামী যুক্তির উদ্দেশ্য হ'ল প্রতিটি যুক্তির অর্থ কী তা পাঠকের কাছে পরিষ্কার করা; এটি ডকুমেন্টেশনের একটি ফর্ম। আমার সমাধানটি দালিলিকাগুলিকে মন্তব্যে অবলম্বন না করে ফাংশন কলের মধ্যে এম্বেড করা সক্ষম করে, যা দেখতে অস্বচ্ছ লাগে।
ব্যবহারকারী 234461

এটি একটি ভিন্ন সমস্যা সমাধান করে। প্রশ্নটি ছিল পরম heightআদেশ নির্বিশেষে নাম দিয়ে যাওয়ার বিষয়ে ।
দিমিত্রি জইতসেভ

@ দিমিত্রিজাইতসেভ আসলে, প্রশ্নটি প্যারামিটার ক্রমানুসারে, বা ওপি কেন নামধারী প্যারাম ব্যবহার করতে চেয়েছিল সে সম্পর্কে কিছুই বলেনি।
ব্যবহারকারী 234461

এটি সি # তে উল্লেখ করে যেখানে কোনও ক্রমে নাম দ্বারা প্যারামগুলি পাস করা কী।
দিমিত্রি জইতসেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.