2015-10-22 18 views
25

Tôi không biết liệu chức năng mũi tên có ràng buộc arguments với phạm vi từ vựng hay không.Chức năng mũi tên ES6 có đối số riêng của chúng hay không?

Hãy xem ví dụ này (các khái niệm tương tự có thể được sử dụng cho this):

var b = function() { return() => console.log(arguments); }; 
b(1,2,3)(4,5,6); // different result of chrome vs FF. 

Khi tôi chạy trên Chrome, tôi nhận được [1,2,3], nhưng trên Firefox, tôi nhận được [4,5,6]. Chuyện gì vậy?

+0

tôi sẽ nói Firefox đã nhận nó đúng thời gian này, mặc dù tôi chắc chắn hiểu tại sao Chrome hoạt động theo cách nó có. Nice tìm! –

+0

@StephanBijzitter theo câu trả lời không:/ –

+2

@StephanBijzitter no, Chrome đã đúng. – naomik

Trả lời

19

Từ spec:

Bất kỳ tài liệu tham khảo để arguments, super, this, hoặc new.target trong một ArrowFunction phải giải quyết đến một ràng buộc trong một môi trường lexically kèm theo.

Do đó, câu trả lời đúng sẽ là [1,2,3]. Firefox đã khắc phục sự cố trong phiên bản 43 (bug 889158).

9

Không, chức năng mũi tên không có riêng của mình arguments, this, super hoặc new.target.

Xem ghi chú ở 14.2.16 Runtime Semantics: Evaluation:

Một ArrowFunction không định nghĩa các ràng buộc địa phương cho arguments, super, this, hoặc new.target. Bất kỳ tham chiếu nào đến arguments, super, this hoặc new.target trong một ArrowFunction phải giải quyết một sự ràng buộc trong môi trường bao quanh. Thông thường, đây sẽ là Function Environment của một hàm kèm theo ngay lập tức.

+0

Bất kỳ tham chiếu nào? –

-3

Điều đang diễn ra thực tế là khá đơn giản. Chrome dường như không thêm đối tượng arguments vào phạm vi của hàm bên trong (mũi tên), trong khi Firefox thực hiện.

Điều này có nghĩa là các đối số được đăng nhập trong Chrome là các đối số được truyền cho hàm gốc, đó là một hàm "bình thường".

Firefox tin rằng (và theo ý kiến ​​của tôi, họ có quyền) rằng các chức năng mũi tên cũng phải có đối tượng arguments, và do đó đó là lý do tại sao chúng ghi lại tập hợp số thứ hai.

Như những người khác đã nói, những gì Firefox làm là chống lại đặc điểm kỹ thuật.

+3

Thông số ECMAScript là gì. Chrome triển khai thông số kỹ thuật và do đó chính xác. Firefox không đúng bất kể ý kiến ​​có thể tồn tại. – naomik

+1

Và đó là những gì dấu ngoặc đơn dành cho ;-) –

+1

Bạn có ý nghĩa gì về Firefox "có quyền" để tin rằng hành vi ECMAScript phải là gì? – naomik

2

Chức năng mũi tên không có đối tượng đối số của riêng chúng.

chức năng mũi tên không phơi bày một lập luận phản đối mã của họ: arguments.length, arguments[0], arguments[1], và vân vân không tham khảo các đối số cung cấp cho các mũi tên chức năng khi gọi.

Arrow_functions

Ví dụ này

var b = function() { 
 
    return() => console.log(arguments); 
 
}; 
 

 
b(1,2,3)(4,5,6);

câu trả lời đúng nên [1, 2, 3]

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