2009-02-25 20 views
32

Mam dwie prawie identyczne funkcje javascript, które są używane do inicjowania wywołania jquery $ .get. Argumenty funkcji są przekazywane do wywoływanego skryptu.Funkcje Javascript i opcjonalne argumenty

Problem polega na tym, że jeden zestaw wywołań wymaga dodatkowego argumentu, a drugi nie.

Aby to osiągnąć, używam dwóch prawie identycznych funkcji javascript, o których wspomniałem. Oto one:

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

Jak widać, 2. Funkcja akceptuje jedynie dodatkowy argument o nazwie „typ”, który jest następnie przekazywany za pośrednictwem połączenia $ .get.

Chcę połączyć te dwie funkcje, ale nie jestem pewien, czy mogę opcjonalnie dołączyć do tego trzeciego argumentu (tablica/obiekt/cokolwiek to jest w {} (tak, javascript noob)), które są przekazywane $ .get.

EDYTUJ tylko po to, aby powiedzieć ... cholera, jesteście dobrzy. : D

+0

Patrz tego wątku [http: // stackoverflow .com/questions/456177/function-overloading-in-javascript-best-practices] (http://stackoverflow.com/questions/456177/function-overloading-in-javascript-best-practices) –

Odpowiedz

29

Ponieważ wszystko, co robisz ze wszystkim, ale URL i DOMID przekazuje go do $.get, dlaczego tego nie zrobić?

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

wszystkich parametrów w javascript są opcjonalne, można użyć tablicę parametrów wewnątrz funkcji do parametrów dostępowych przeszedł ordinally tak:

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

myFunction("Hello", "World"); 

produkuje: szczęśliwy dzień, Opcja 1 = Witam, Opcja 2 = światowej

Mam nadzieję, że ilustruje to, w jaki sposób można użyć tablicy argumentów do ulepszenia kodu.

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

Następnie można wywołać go z ostatnim parametrem będącym typem jako opcjonalnym, jeśli parametr zostanie przekazany, jest używany, jeśli nie jest pominięty.

Ponadto, ponieważ rzeczywisty parametr jest opcjonalny w pierwszej kolejności można również dodać nazwę do końca definicji funkcji i korzystać z tego samego ale jeśli zamiast arguments[4] zrobiłbyś 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); 
      }); 
    } 

ten zaproszenie będzie obejmować rodzaj

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

gdzie to wezwanie nie

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

:/sorry, I nie jestem pewien, jak mogę tego użyć, aby rozwiązać mojego pro blem ... – Ian

+0

Opublikuję twój kod na przykładzie. –

+0

Musiałbyś umieścić opcjonalny parametr na końcu listy parametrów, aby wszystkie miały stałe liczby, a następnie możesz uzyskać do nich dostęp za pomocą argumentów [x] zamiast ich nazw. – schnaader

14

kilka prostych sposobów na to

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

na nieograniczony argumentów można użyć 'argumenty' tablicy Przykład:

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

ExampleArguments('arg1',2,someVar); 
Powiązane problemy