2009-02-25 20 views
32

Tengo dos funciones javascript casi idénticas que se utilizan para iniciar una llamada jquery $ .get. Los argumentos para la función se pasan al script que se está llamando.Funciones de Javascript y argumentos opcionales

El problema es que un conjunto de llamadas requiere un argumento adicional que el otro no.

Para lograr esto estoy usando las dos funciones javascript casi idénticas que he mencionado. Aquí están:

function process(url, domid, domain, scan_id) 
{ 
    $.get(url, 
    { 
     domain: domain, 
     scan_id: scan_id 
    }, 

    function(data) 
    { 
     $(domid).html(data); 
    }); 
} 

function process_type(url, domid, type, domain, scan_id) 
{ 
    $.get(url, 
    { 
     domain: domain, 
     type: type, 
     scan_id: scan_id 
    }, 

    function(data) 
    { 
     $(domid).html(data); 
    }); 
} 

Como se puede ver, la segunda función se limita a aceptar un argumento adicional llamado 'tipo' que se pasa luego a través de la llamada $ .get.

Quiero combinar estas dos funciones, pero no estoy seguro de cómo puedo opcionalmente incluir ese tercer argumento en eso (matriz/objeto/lo que sea en {} (sí, javascript noob)) que se está pasando en $ .get.

EDIT solo para decir .... maldición, ustedes son buenos. : D

+0

se refieren a este hilo [http: // stackoverflow .com/questions/456177/function-overloading-in-javascript-best-practices] (http://stackoverflow.com/questions/456177/function-overloading-in-javascript-best-practices) –

Respuesta

29

Dado que todo lo que está haciendo con todo menos url y domid es pasarlo al $.get, ¿por qué no hacer esto?

function process_type(url, domid, args) { 
    $.get(url, args, function(data) { 
     $(domid).html(data); 
    }); 
} 

// call it without type 
process_type('myurl', 'domid', {domain:'..', scanid:'...'}); 
// call it with type 
process_type('myurl', 'domid', {type: '..', domain:'..', scanid:'..'}); 
35

todos los parámetros en javascript son opcionales, puede utilizar la matriz de parámetros dentro de una función de los parámetros de acceso pasado ordinalmente así:

function myFunction(option1) 
{ 
    var option2 = arguments[1]; 
    if(arguments[0] == option1) 
     alert("Happy Day, Option1 = " + option1 + ", Option2 = " + option2); 
} 

myFunction("Hello", "World"); 

Produce: Happy Day, la opción 1 = Hola, Opción 2 = Mundial

Esperemos que esto ilustre cómo puede usar la matriz de argumentos para mejorar algún código.

function process_type(url, domid, domain, scan_id) 
    { 
      var myOptions = { 
       domain: domain, 
       scan_id: scan_id 
      }; 

      if(arguments[4]) 
       myOptions["type"] = arguments[4]; 

      $.get(url, myOptions, 

      function(data) 
      { 
        $(domid).html(data); 
      }); 
    } 

Entonces se le puede llamar con el último parámetro es el tipo como opcional, si se pasa el parámetro que se utiliza si no se omite.

Asimismo, puesto que el parámetro real es opcional en el primer lugar también se puede añadir el nombre al final de la definición de la función y el uso de la misma, si, pero en lugar de arguments[4] que haría if(type) myOptions["type"] = type;

function process_type(url, domid, domain, scan_id, type) 
    { 
      var myOptions = { 
       domain: domain, 
       scan_id: scan_id 
      }; 

      if(type) 
       myOptions["type"] = type; 

      $.get(url, myOptions, 

      function(data) 
      { 
        $(domid).html(data); 
      }); 
    } 

Este llamada incluiría tipo

process_type("xxx", "xxx", "xxx", "xxx", "xxx"); 

donde esta llamada no haría

process_type("xxx", "xxx", "xxx", "xxx"); 
+0

:/lo siento, yo No estoy seguro de cómo puedo usar eso para resolver mi pro blem ... – Ian

+0

Voy a publicar su código con un ejemplo. –

+0

Tendría que poner su parámetro opcional al final de la lista de parámetros para que todos ellos tengan números fijos, luego puede acceder a ellos por argumentos [x] en lugar de por sus nombres. – schnaader

14

Algunas formas sencillas de hacerlo

// 'b' is optional 
// the 'null' value would be the default value 

function Example1(a,b){ 
    b = b || null; 

    // Some code here 
} 

function Example2(a,b){ 
    if(typeof b == 'undefined') b = null; 

    // Some code here 
} 

function Example3(a,b){ 
    if(b === undefined) b=null; 

    // Some code here 
} 

function Example4(a,b){ 
    if(!b) b=null; 

    // Some code here 
} 

Para argumentos que puede utilizar un número ilimitado de la matriz 'argumentos', ejemplo:

function ExampleArguments(){ 
    for(var i=0; i<arguments.length; i++){ 
      // Alert the current argument 
      alert(arguments[i]); 
    } 
} 

ExampleArguments('arg1',2,someVar); 
Cuestiones relacionadas