javascript w3schools জাভাস্ক্রিপ্ট মধ্যে ঐচ্ছিক পরামিতি হ্যান্ডলিং




w3schools (10)

এই আমি স্ব ব্যাখ্যামূলক উদাহরণ হতে পারে অনুমান:

function clickOn(elem /*bubble, cancelable*/) {
    var bubble =     (arguments.length > 1)  ? arguments[1] : true;
    var cancelable = (arguments.length == 3) ? arguments[2] : true;

    var cle = document.createEvent("MouseEvent");
    cle.initEvent("click", bubble, cancelable);
    elem.dispatchEvent(cle);
}

আমি একটি স্ট্যাটিক জাভাস্ক্রিপ্ট ফাংশন আছে যা 1, 2 বা 3 পরামিতি নিতে পারে:

function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional

আমি জানি যে কোনও প্রদেয় প্যারামিটার অনির্ধারিত থাকলে আমি সর্বদা পরীক্ষা করতে পারি, তবে কীভাবে প্যারামিটার বা কলব্যাকটি পাস করা হয়েছিল তা আমি কীভাবে জানতে পারি?

এই কাজ করার সেরা উপায় কি?

কি পাস হতে পারে এর উদাহরণ:

1:

getData('offers');

2:

var array = new Array();
array['type']='lalal';
getData('offers',array);

3:

var foo = function (){...}
getData('offers',foo);

4:

getData('offers',array,foo);

এআর - এর অর্থ হ'ল আপনি আপনার ফাংশনকে আর্গুমেন্টগুলির সাথে আহ্বান করছেন যা যথাযথভাবে নয় ... যা আমি সুপারিশ করব না।

আমি পরিবর্তে আপনার ফাংশন একটি বস্তু খাওয়ানো যেমন সুপারিশ করবে:

function getData( props ) {
    props = props || {};
    props.params = props.params || {};
    props.id = props.id || 1;
    props.callback = props.callback || function(){};
    alert( props.callback )
};

getData( {
    id: 3,
    callback: function(){ alert('hi'); }
} );

উপকারিতা:

  • আপনি যুক্তি আদেশ জন্য অ্যাকাউন্ট আছে না
  • আপনি টাইপ চেক করতে হবে না
  • ডিফল্ট মানের সংজ্ঞায়িত করা সহজ কারণ কোনও টাইপ পরীক্ষণের প্রয়োজন নেই
  • কম মাথা ব্যাথা। কল্পনা করুন যদি আপনি চতুর্থ যুক্তি যোগ করেন তবে আপনাকে আপনার টাইপটি প্রতি একক সময় চেক করতে হবে এবং চতুর্থ বা ক্রমাগতও যদি ফাংশন থাকে তবে কী হবে?

অপূর্ণতা:

  • কোড রিফ্যাক্টর সময়

যদি আপনার কোনও পছন্দ না থাকে তবে কোনও বস্তু প্রকৃতপক্ষে একটি ফাংশন কিনা তা সনাক্ত করার জন্য আপনি একটি ফাংশন ব্যবহার করতে পারেন (শেষ উদাহরণ দেখুন)।

নোট: এটি একটি ফাংশন সনাক্ত করার সঠিক উপায়:

function isFunction(obj) {
    return Object.prototype.toString.call(obj) === "[object Function]";
}

isFunction( function(){} )

আমার মনে হয় আপনি এখানে typeof () ব্যবহার করতে চান:

function f(id, parameters, callback) {
  console.log(typeof(parameters)+" "+typeof(callback));
}

f("hi", {"a":"boo"}, f); //prints "object function"
f("hi", f, {"a":"boo"}); //prints "function object"

আপনার ফাংশনে কতগুলি arguments পাস করা হয়েছে তা আপনি জানতে পারেন এবং আপনার দ্বিতীয় যুক্তি একটি ফাংশন কিনা তা যাচাই করতে পারেন:

function getData (id, parameters, callback) {
  if (arguments.length == 2) { // if only two arguments were supplied
    if (Object.prototype.toString.call(parameters) == "[object Function]") {
      callback = parameters; 
    }
  }
  //...
}

আপনি এই ভাবে আর্গুমেন্ট বস্তুটি ব্যবহার করতে পারেন:

function getData (/*id, parameters, callback*/) {
  var id = arguments[0], parameters, callback;

  if (arguments.length == 2) { // only two arguments supplied
    if (Object.prototype.toString.call(arguments[1]) == "[object Function]") {
      callback = arguments[1]; // if is a function, set as 'callback'
    } else {
      parameters = arguments[1]; // if not a function, set as 'parameters'
    }
  } else if (arguments.length == 3) { // three arguments supplied
      parameters = arguments[1];
      callback = arguments[2];
  }
  //...
}

আপনি যদি আগ্রহী হন তবে জাভাস্ক্রিপ্টে পদ্ধতির ওভারলোডিং অনুকরণ করার কৌশল সম্পর্কে জন রেসিগ এই article দেখুন।


যদি আপনার সমস্যা শুধুমাত্র ফাংশন ওভারলোডিংয়ের সাথে থাকে (আপনাকে 'পরামিতি' পরামিতিটি 'পরামিতি' এবং 'কলব্যাক' নয় তা পরীক্ষা করতে হবে), আমি আপনাকে যুক্তিযুক্ত প্রকারের বিষয়ে বিরক্ত করবেন না এবং আমি সুপারিশ করব
এই পদ্ধতি ব্যবহার করুন। ধারণাটি সহজ - আপনার পরামিতিগুলিকে একত্রিত করার জন্য আক্ষরিক বস্তুগুলি ব্যবহার করুন:

function getData(id, opt){
    var data = voodooMagic(id, opt.parameters);
    if (opt.callback!=undefined)
      opt.callback.call(data);
    return data;         
}

getData(5, {parameters: "1,2,3", callback: 
    function(){for (i=0;i<=1;i--)alert("FAIL!");}
});

আপনি প্রাপ্ত পরামিতি টাইপ পরীক্ষা করা উচিত। হয়তো আপনাকে arguments অ্যারে ব্যবহার করতে হবে কারণ দ্বিতীয় প্যারামিটার কখনও কখনও 'প্যারামিটার' হতে পারে এবং কখনও কখনও 'কলব্যাক' এবং এটি পরামিতিগুলিকে নামকরণ করা বিভ্রান্তিকর হতে পারে।


আমি ArgueJS ব্যবহার করার জন্য আপনাকে সুপারিশ।

আপনি এইভাবে আপনার ফাংশন টাইপ করতে পারেন:

function getData(){
  arguments = __({id: String, parameters: [Object], callback: [Function]})

  // and now access your arguments by arguments.id,
  //          arguments.parameters and arguments.callback
}

আমি আপনার উদাহরণ দ্বারা বিবেচিত যে আপনি আপনার id পরামিতি একটি স্ট্রিং হতে চান, অধিকার? এখন, getData একটি String id প্রয়োজন এবং বিকল্প Object parameters এবং Function callback বিকল্প গ্রহণ করা হয়। আপনি পোস্ট ব্যবহার সব ক্ষেত্রে প্রত্যাশিত হিসাবে কাজ করবে।


আমি জানি এটি একটি পুরানো পুরনো প্রশ্ন, কিন্তু আমি সম্প্রতি এটি নিয়ে আলোচনা করেছি। আমাকে এই সমাধান সম্পর্কে আপনি কি মনে করেন।

আমি একটি ইউটিলিটি তৈরি করেছি যা আমাকে দৃঢ়ভাবে আর্গুমেন্ট টাইপ করতে দেয় এবং তাদের ঐচ্ছিক হতে দেয়। আপনি মূলত একটি প্রক্সি আপনার ফাংশন মোড়ানো। যদি আপনি একটি যুক্তি এড়িয়ে যান, এটি অনির্ধারিত । একে অপরের পাশে একই ধরনের একাধিক ঐচ্ছিক আর্গুমেন্ট আছে যদি এটি quirky পেতে পারে। (কাস্টম আর্গুমেন্ট চেকগুলি করার পরিবর্তে ফাংশনগুলি পাস করার বিকল্প রয়েছে, পাশাপাশি প্রতিটি প্যারামিটারের জন্য ডিফল্ট মান উল্লেখ করে।)

বাস্তবায়ন এই রকম দেখাচ্ছে:

function displayOverlay(/*message, timeout, callback*/) {
  return arrangeArgs(arguments, String, Number, Function, 
    function(message, timeout, callback) {
      /* ... your code ... */
    });
};

স্পষ্টতা জন্য, এখানে কি হচ্ছে:

function displayOverlay(/*message, timeout, callback*/) {
  //arrangeArgs is the proxy
  return arrangeArgs(
           //first pass in the original arguments
           arguments, 
           //then pass in the type for each argument
           String,  Number,  Function, 
           //lastly, pass in your function and the proxy will do the rest!
           function(message, timeout, callback) {

             //debug output of each argument to verify it's working
             console.log("message", message, "timeout", timeout, "callback", callback);

             /* ... your code ... */

           }
         );
};

আপনি এখানে আমার GitHub রিপোজিটরিতে arrangeArgs প্রক্সি কোড দেখতে পারেন:

https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js

এখানে রিপোজিটরি থেকে অনুলিপি করা কিছু মন্তব্যের সাথে ইউটিলিটি ফাংশন রয়েছে:

/*
 ****** Overview ******
 * 
 * Strongly type a function's arguments to allow for any arguments to be optional.
 * 
 * Other resources:
 * http://ejohn.org/blog/javascript-method-overloading/
 * 
 ****** Example implementation ******
 * 
 * //all args are optional... will display overlay with default settings
 * var displayOverlay = function() {
 *   return Sysmo.optionalArgs(arguments, 
 *            String, [Number, false, 0], Function, 
 *            function(message, timeout, callback) {
 *              var overlay = new Overlay(message);
 *              overlay.timeout = timeout;
 *              overlay.display({onDisplayed: callback});
 *            });
 * }
 * 
 ****** Example function call ******
 * 
 * //the window.alert() function is the callback, message and timeout are not defined.
 * displayOverlay(alert);
 * 
 * //displays the overlay after 500 miliseconds, then alerts... message is not defined.
 * displayOverlay(500, alert);
 * 
 ****** Setup ******
 * 
 * arguments = the original arguments to the function defined in your javascript API.
 * config = describe the argument type
 *  - Class - specify the type (e.g. String, Number, Function, Array) 
 *  - [Class/function, boolean, default] - pass an array where the first value is a class or a function...
 *                                         The "boolean" indicates if the first value should be treated as a function.
 *                                         The "default" is an optional default value to use instead of undefined.
 * 
 */
arrangeArgs: function (/* arguments, config1 [, config2] , callback */) {
  //config format: [String, false, ''], [Number, false, 0], [Function, false, function(){}]
  //config doesn't need a default value.
  //config can also be classes instead of an array if not required and no default value.

  var configs = Sysmo.makeArray(arguments),
      values = Sysmo.makeArray(configs.shift()),
      callback = configs.pop(),
      args = [],
      done = function() {
        //add the proper number of arguments before adding remaining values
        if (!args.length) {
          args = Array(configs.length);
        }
        //fire callback with args and remaining values concatenated
        return callback.apply(null, args.concat(values));
      };

  //if there are not values to process, just fire callback
  if (!values.length) {
    return done();
  }

  //loop through configs to create more easily readable objects
  for (var i = 0; i < configs.length; i++) {

    var config = configs[i];

    //make sure there's a value
    if (values.length) {

      //type or validator function
      var fn = config[0] || config,
          //if config[1] is true, use fn as validator, 
          //otherwise create a validator from a closure to preserve fn for later use
          validate = (config[1]) ? fn : function(value) {
            return value.constructor === fn;
          };

      //see if arg value matches config
      if (validate(values[0])) {
        args.push(values.shift());
        continue;
      }
    }

    //add a default value if there is no value in the original args
    //or if the type didn't match
    args.push(config[2]);
  }

  return done();
}

আপনি ফাংশন ওভাররাইড করতে পারেন? এটা কাজ করবে না

function doSomething(id){}
function doSomething(id,parameters){}
function doSomething(id,parameters,callback){}







javascript