2011-01-31 30 views
49

Trong Javascript, làm cách nào để xác định số tham số chính thức được xác định cho một hàm?Nhận tính linh hoạt của hàm

Lưu ý, đây không phải là tham số arguments khi hàm được gọi, nhưng số đối số được đặt tên hàm được xác định.

function zero() { 
    // Should return 0 
} 

function one(x) { 
    // Should return 1 
} 

function two(x, y) { 
    // Should return 2 
} 
+1

Tính chất của hàm() {return arguments [0]; }? – AtnNn

+5

@atnnn 0, tất nhiên. – Phrogz

Trả lời

54
> zero.length 
0 
> one.length 
1 
> two.length 
2 

Source

Một chức năng có thể xác định arity riêng của mình (chiều dài) như thế này: arity

// For IE, and ES5 strict mode (named function) 
function foo(x, y, z) { 
    return foo.length; // Will return 3 
} 

// Otherwise 
function bar(x, y) { 
    return arguments.callee.length; // Will return 2 
} 
+0

Tôi dự định trả lời câu hỏi của riêng mình vì nó không nằm trên Stack Overflow nhưng bạn đã đánh bại tôi với nó! Tôi sẽ cập nhật câu trả lời của bạn với kỹ thuật cho một hàm để xác định tính chất của chính nó. – JasonSmith

+0

Bạn có nghĩa là 'arguments.callee.length'? – Phrogz

+0

Vâng, tôi có ý đó. – JasonSmith

11

của một chức năng được lưu trữ trong tài sản .length của nó.

function zero() { 
    return arguments.callee.length; 
} 

function one(x) { 
    return arguments.callee.length; 
} 

function two(x, y) { 
    return arguments.callee.length; 
} 

> console.log("zero="+zero() + " one="+one() + " two="+two()) 
zero=0 one=1 two=2 
4

Như được đề cập trong các câu trả lời khác, thuộc tính length cho bạn biết điều đó. Vì vậy zero.length sẽ là 0, one.length sẽ là 1, và two.length sẽ 2.

Tính đến ES2015, chúng ta có hai nếp nhăn:

  • Chức năng có thể có một tham số "nghỉ ngơi" ở cuối của tham số danh sách mà tập hợp lên bất kỳ đối số được đưa ra tại vị trí đó hoặc sau đó vào một mảng thật sự (không giống như các pseudo-mảng arguments)
  • thông số chức năng có thể có giá trị mặc định

các "res t" tham số không được tính khi xác định arity của hàm:

function stillOne(a, ...rest) { } 
 
console.log(stillOne.length); // 1

Tương tự như vậy, một tham số với một đối số mặc định không thêm vào arity, và trong thực tế ngăn chặn bất kỳ người khác sau đó từ thêm vào nó ngay cả khi họ không có giá trị mặc định rõ ràng (họ đang giả định có một mặc định im lặng của undefined):

function oneAgain(a, b = 42) { } 
 
console.log(oneAgain.length); // 1 
 

 
function oneYetAgain(a, b = 42, c) { } 
 
console.log(oneYetAgain.length); // 1

+0

Cảm ơn! Đây là một bản cập nhật tuyệt vời. Tôi nghĩ rằng '... phần còn lại', trong khi nó giấu đi sự thật, thuộc tính' .length' vẫn hữu ích. Nhưng trong trường hợp các tham số mặc định, bạn có biết cách giải quyết nào hay thậm chí chỉ là cách để phát hiện các tham số mặc định đang được sử dụng? – JasonSmith

+0

@JasonSmith: Không có gì không phụ thuộc vào việc giải mã (ví dụ: 'Hàm số # toString'). –

0

Một hàm số là số tham số chứa hàm. Nó có thể đạt được bằng cách gọi thuộc tính độ dài.

Ví dụ:

function add(num1,num2){} 
console.log(add.length); // --> 2 

function add(num1,num2,num3){} 
console.log(add.length); // --> 3 

Lưu ý: số lượng các thông số thông qua trong một cuộc gọi chức năng không ảnh hưởng đến arity của hàm.

0

Thuộc tính cơ sở được sử dụng để trả về số đối số mà hàm này mong đợi, tuy nhiên, nó không còn tồn tại và đã được thay thế bằng thuộc tính Function.prototype.length.

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