2009-02-25 44 views
32

Tôi có hai hàm javascript gần như giống hệt nhau được sử dụng để bắt đầu một cuộc gọi jquery $ .get. Các đối số cho hàm được truyền cho kịch bản được gọi.Chức năng Javascript và các đối số tùy chọn

Vấn đề là một tập hợp các cuộc gọi yêu cầu một đối số bổ sung mà đối tượng kia không thực hiện.

Để thực hiện việc này, tôi đang sử dụng hai hàm javascript gần như giống hệt nhau mà tôi đã đề cập. Dưới đây là:

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

Như bạn có thể thấy, hàm thứ 2 chỉ chấp nhận một đối số bổ sung được gọi là 'loại' mà sau đó được chuyển qua lệnh gọi $ .get.

Tôi muốn kết hợp hai chức năng này, nhưng tôi không chắc làm thế nào tôi có thể tùy chọn bao gồm đối số thứ 3 trong đó (mảng/đối tượng/bất kỳ thứ gì trong {} (vâng, javascript noob)) đang được chuyển vào $ .get.

CHỈ CHỈNH SỬA để nói .... chết tiệt, các bạn rất tốt. : D

+0

Tham khảo chủ đề này [http: // stackoverflow .com/questions/456177/function-overloading-in-javascript-best-practices] (http://stackoverflow.com/questions/456177/function-overloading-in-javascript-best-practices) –

Trả lời

29

Vì tất cả những gì bạn đang làm với mọi thứ nhưng url và domid sẽ chuyển nó đến $.get, tại sao bạn không làm điều này?

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

tất cả các thông số trong javascript là không bắt buộc, bạn có thể sử dụng các mảng thông số bên trong một hàm với các thông số truy cập thông qua ordinally như vậy:

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

myFunction("Hello", "World"); 

Tạo: Happy Day, OPTION1 = Xin chào, OPTION2 = Thế giới

Hy vọng điều này minh họa cách bạn có thể sử dụng mảng đối số để cải thiện một số mã.

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

Sau đó, bạn có thể gọi thông số này là tham số cuối cùng là loại tùy chọn, nếu thông số được truyền, nó được sử dụng nếu không bị bỏ qua.

Cũng kể từ khi thông số thực tế là không bắt buộc ở nơi đầu tiên bạn cũng có thể thêm tên đến cuối của định nghĩa chức năng và sử dụng tương tự nếu nhưng thay vì arguments[4] bạn muốn làm 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); 
      }); 
    } 

này gọi sẽ bao gồm loại

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

nơi cuộc gọi này sẽ không

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

:/xin lỗi, tôi 'không chắc làm thế nào tôi có thể sử dụng nó để giải quyết pro của tôi blem ... – Ian

+0

Tôi sẽ đăng mã của bạn với một ví dụ. –

+0

Bạn sẽ phải đặt tham số tùy chọn vào cuối danh sách tham số để tất cả chúng có số cố định, sau đó bạn có thể truy cập chúng theo các đối số [x] thay cho tên của chúng. – schnaader

14

Một số cách đơn giản để làm điều đó

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

Đối với đối số không giới hạn, bạn có thể sử dụng các mảng 'tranh luận', ví dụ:

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

ExampleArguments('arg1',2,someVar); 
Các vấn đề liên quan