2010-06-25 44 views
9

Tôi nghĩ rằng tôi cần một cái gì đó giống như sply của ruby ​​* tại đây.Javascript: Chuyển tiếp các cuộc gọi hàm nhận số biến số của đối số

function foo() { 
    var result = ''; 
    for (var i = 0; i < arguments.length; i++) { 
    result += arguments[i]; 
    } 
    return result; 
} 

function bar() { 
    return foo(arguments) // this line doesn't work as I expect 
} 

bar(1, 2, 3); 

Tôi muốn trả lại "123", nhưng thay vào đó tôi nhận được "[object Arguments]". Điều đó có ý nghĩa, tôi cho là vậy. Nó truyền đối tượng đại diện cho các đối số, nhưng không phải là đối số riêng lẻ.

Vì vậy, làm thế nào để tôi chỉ đơn giản là chuyển tiếp bất kỳ số lượng đối số cho một chức năng mà có bất kỳ số lượng đối số?

Trả lời

19

Để vượt qua một cách chính xác các đối số chức năng khác, bạn cần phải sử dụng apply:

function bar() { 
    return foo.apply(null, arguments); 
} 

Phương pháp apply có hai tham số, đầu tiên là thisObj, giá trị của nó sẽ được sử dụng như giá trị this bên trong hàm được gọi, nếu bạn sử dụng null hoặc undefined, giá trị this bên trong hàm sẽ tham chiếu đến đối tượng chung.

Đối số thứ hai mà apply mong đợi, là một đối tượng giống như mảng chứa đối số được áp dụng cho hàm.

Kiểm tra ví dụ trên here.

3

Hãy thử điều này return foo.apply(this,arguments). Ngoài ra, bạn chỉ có thể sử dụng Array.prototype.slice.apply(arguments).join('') cho hàm foo của bạn.

Các vấn đề liên quan