2017-01-19 30 views
18
function foo(x) { 
    console.log(arguments) 
} //foo(1) prints [1] 

nhưngTại sao chức năng mũi tên không có mảng đối số?

var bar = x => console.log(arguments) 

cung cấp cho các lỗi sau khi viện dẫn trong cùng một cách:

Uncaught ReferenceError: arguments is not defined 
+2

Đó không phải là chức năng mang tính chất nhưng các hàm mũi tên không có đối tượng 'arguments'. Vì vậy, câu hỏi của bạn là đưa ra một tuyên bố/giả định không chính xác. Các hàm ẩn danh thông thường được khai báo với từ khóa 'function' có đối tượng' arguments' tốt. – jfriend00

+3

Các câu hỏi về quyết định thiết kế ngôn ngữ nói chung không phù hợp với Stack Overflow. –

Trả lời

38

chức năng mũi tên không có điều này vì đối tượng arguments mảng giống như là một cách giải quyết để bắt đầu với ES6 đã giải quyết với tham số còn lại:

var bar = (...arguments) => console.log(arguments); 

arguments không được bảo lưu ở đây mà chỉ được chọn. Bạn có thể gọi nó là bất cứ điều gì bạn muốn và nó có thể được kết hợp với các thông số bình thường:

var test = (one, two, ...rest) => [one, two, rest]; 

Bạn thậm chí có thể đi theo con đường khác, minh họa bằng lạ mắt này được áp dụng:

var fapply = (fun, args) => fun(...args); 
+1

Điểm tốt về cách các đối số còn lại làm giảm sự cần thiết đối tượng 'arguments'. Với các đối số còn lại, bạn có thể có một mảng thực sự bất cứ khi nào bạn thực sự muốn nó. bit không có chi phí ngôn ngữ khi nó không được sử dụng. – jfriend00

+0

Cảm ơn việc sử dụng toán tử còn lại dường như hoạt động tốt. – Conqueror

+1

Tôi nghĩ trong ngữ cảnh này, '... đối số' biểu thị * tham số còn lại *, không phải * đối số còn lại *. Xem [* Array.of (... items) *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-array.of) trong đó thuật ngữ "đối số nghỉ" được sử dụng , trong khi trong [* String.fromCharCode (... codeUnits) *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-string.fromcharcode) thuật ngữ "tham số còn lại" là đã sử dụng. – RobG

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