2011-01-16 35 views
15

Tôi có một hàm chấp nhận bất kỳ số lượng và loại đối số nào, do đó không có tham số cụ thể nào được xác định. Hàm này nên gọi một hàm khác chuyển tất cả các đối số.Làm cách nào để chuyển tất cả các đối số dưới dạng tập hợp sang một hàm khác chứ không phải là đối số đơn?

Vấn đề là tôi có thể vượt qua "đối số" để bao gồm tất cả các đối số nhưng trong trường hợp này nó sẽ hoạt động giống như một đối số chứ không phải cách chúng ta mong đợi đối số hoạt động.

Một ví dụ:

Các chức năng chính:

function handleCall() { 
    // let's call a sub-function 
    // and pass all arguments (my question is how this is handled the right way) 
    function callSubFunction(arguments); 
} 

function callSubfunction(userid, customerid, param) { 
    // passed arguments are now 
    alert('userid = ' + userid); 

    // this will not work, you have to use arguments[2] 
    alert(param); 
    } 

The example call: 

handleCall(1029, 232, 'param01'); 

Sử dụng phương pháp trên, tất cả các đối số sẽ được lưu trữ trong "userid" như pseudo-mảng và các mặt hàng có thể được truy cập ví dụ đối số [2] nhưng không sử dụng tên tham số "param".

Trong ColdFusion, giải pháp cho công cụ như vậy là tham số "argumentCollection", theo cách này bạn có thể chuyển các tham số được lưu trữ trong cấu trúc mà không bị chuyển đổi thành một đối số có kiểu struct chứa tất cả khóa/giá trị.

Làm cách nào để có thể đạt được điều tương tự với JavaScript?

Trả lời

29

Bạn có thể sử dụng the .apply() method để gọi hàm và chuyển đối số làm bộ.

callSubFunction.apply(this, arguments); 

Đối số đầu tiên sẽ thiết lập giá trị của this trong phương pháp allSubFunction. Tôi chỉ cần đặt giá trị hiện tại là this. Thứ hai là tập hợp các đối số để gửi.

Vì vậy, chức năng handleCall() của bạn sẽ trông giống như:

function handleCall() { 
    //set the value of "this" and pass on the arguments object 
    callSubFunction.apply(this, arguments); 
} 

Nó không phải là bắt buộc mà bạn gửi cho một đối tượng Arguments. Bạn có thể gửi Array đối số nếu trường hợp cần thiết.

1

Sử dụng áp dụng như sau:

function Foo() 
{ 
    Bar.apply(this, arguments); 
} 

function Bar(a, b) 
{ 
    alert(a); 
    alert(b); 
} 
15

Nếu bạn muốn làm điều tương tự với spread syntax, bạn có thể sử dụng như sau:

function handleCall(...args) { 
    callSubFunction(...args); 
} 
Các vấn đề liên quan