2012-02-18 8 views
26

Trong Chrome, khi tôi gõ console.log trong hình dưới đây:Javascript: thông số "Infinite" cho chức năng?

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

... nó in một cách chính xác, không có lỗi hoặc cảnh báo. Tôi nối thêm nhiều thông số, nhưng nó vẫn in ra một cách chính xác.

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter"); 

Làm cách nào để có chức năng tham số "vô hạn" giống như chức năng đó?

Trả lời

46

Chức năng có thể truy cập một đối tượng mảng giống như gọi arguments có chứa tất cả các đối số mà họ nhận được

function print_my_arguments(/**/){ 
    var args = arguments; 
    for(var i=0; i<args.length; i++){ 
     console.log(args[i]); 
    } 
}; 

Và bạn có thể làm việc chuyển đổi ngược lại (gọi một chức năng được đưa ra một danh sách các đối số) với phương pháp áp dụng :

// These are equivalent: 
print_my_arguments(1,2,3); 
print_my_arguments.apply(null, [1,2,3]); 

// The first parameter to `apply` is the `this`. 
// It is used when the function is a method. 
foo.bar(1,2,3); 
var f = foo.bar; f.apply(foo, [1,2,3]); 

Một số điểm quan trọng cần lưu ý:

  1. arguments không phải là một mảng thực tế và nó không có phương thức mảng thông thường nào (slice, join, etc). Bạn có thể chuyển nó sang một mảng với dòng sau:

    var args = Array.prototype.slice.call(arguments); 
    
  2. Slice cũng rất hữu ích nếu bạn muốn mảng của bạn để chỉ chứa các đối số không tên đó đã nhận được:

    function foo(first_arg, second_arg /**/){ 
        var variadic_args = Array.prototype.slice.call(arguments, 2); 
    } 
    
  3. Không mọi trình duyệt có thể xử lý một số lượng lớn các tham số chức năng tùy ý. Thời gian qua tôi đã thử nghiệm điều này, trong Chrome và IE có một stackoverflow sau khi một số 200.000 đối số. Nếu hàm của bạn có thể nhận được một số lượng lớn các đối số, hãy xem xét đóng gói tất cả các đối số đó trong một mảng thông thường thay thế.

  4. Những người /**/ nhận xét xuất hiện trong danh sách đối số cho ví dụ của tôi là không bắt buộc. Chúng chỉ là một quy tắc mã hóa mà tôi sử dụng để đánh dấu các hàm variadic của tôi và phân biệt chúng với các hàm thường xuyên.

    // A quick glance would suggest that this function receives no 
    // parameters but actually it is a variadic function that gets 
    // its parameters via the `arguments` object. 
    function foo(){ 
        console.log(arguments.length); 
    } 
    
+0

lớn trả lời, 1 cho cẩn thận, tôi đã không đọc chúng và chạy đầu tiên. –

0

Bạn có thể sử dụng các đối số mảng: jsfiddle.net/kUnJ2/

+0

Đây là câu trả lời của câu trả lời trước. Trong tương lai, nó sẽ giúp nếu bạn có thể cung cấp một câu trả lời thay thế hoặc thêm giá trị cho (các) câu trả lời hiện có –