2009-02-25 5 views
32

У меня есть две почти идентичные функции javascript, которые используются для инициирования вызова jquery $ .get. Аргументы функции передаются вызываемому сценарию.Javascript Функции и необязательные аргументы

Проблема в том, что для одного набора вызовов требуется дополнительный аргумент, который другой не имеет.

Для этого я использую две почти идентичные функции javascript, о которых я упомянул. Вот они:

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

Как вы можете видеть, вторая функция просто принимает дополнительный аргумент, называемый «тип», который затем проходит через вызов $ .get.

Я хочу объединить эти две функции, но я не уверен, как я могу дополнительно включить этот третий аргумент в это (массив/объект/что бы он ни находился в {} (да, javascript noob)), который передается в $ .get.

EDIT просто сказать .... черт возьми, вы, ребята, хороши. : D

+0

Обратитесь к этой теме [Http: // StackOverflow .com/questions/456177/function-overloading-in-javascript-best-practices] (http://stackoverflow.com/questions/456177/function-overloading-in-javascript-best-practices) –

ответ

29

Поскольку все, что вы делаете со всем, кроме URL-адреса и домида, передает его $.get, почему бы не сделать это?

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

все параметры в JavaScript являются необязательными, вы можете использовать массив параметров внутри функции для доступа к параметрам передается ординально как так:

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

myFunction("Hello", "World"); 

производит: Happy Day, Option1 = Привет, Option2 = World

Надеюсь, это иллюстрирует, как вы можете использовать массив аргументов для улучшения кода.

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

Тогда вы можете вызвать его с последним параметром является тип, как опция, если передается параметр используется, если не он опущен.

Кроме того, так как фактический параметр является необязательным, в первую очередь вы также можете добавить имя в конце определения функции и использовать то же самое, если, но вместо того, чтобы arguments[4] вы могли бы сделать 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); 
      }); 
    } 

Это вызов будет включают тип

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

где этот призыв будет не

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

:/извините, я Я не знаю, как я могу это использовать, чтобы решить мою профессиональную blem ... – Ian

+0

Я отправлю ваш код с примера. –

+0

Вам нужно будет поместить свой необязательный параметр в конец списка параметров, чтобы все они имели фиксированные номера, а затем вы можете получить к ним доступ по аргументам [x] вместо их имен. – schnaader

14

несколько простых способов сделать это

// '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 
} 

Для неограниченных аргументы, которые вы можете использовать 'аргументы' массива, пример:

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

ExampleArguments('arg1',2,someVar); 
Смежные вопросы