Tại sao ES6 không có chức năng mũi tên mỏng?


16

ES6 đã thêm các hàm mũi tên chất béo ( =>), có hai điểm khác biệt chính so với các hàm thông thường:

  • cú pháp ngắn hơn (bao gồm trả về ngầm định nếu bạn sử dụng phần thân biểu thức)
  • kế thừa thistừ phạm vi xung quanh

Đây là cả hai tính năng rất hữu ích, nhưng dường như tôi hoàn toàn tách biệt về giá trị và ứng dụng của chúng - đôi khi tôi muốn cái này, hoặc cái kia, hoặc cả hai, hoặc không. Có vẻ kỳ lạ là nếu tôi muốn sử dụng hàm cú pháp ngắn, tôi cũng phải sử dụng thishành vi -modifying. Và ngược lại. Tôi không thấy lý do tại sao hai khả năng này được triển khai như là một bổ sung duy nhất cho ngôn ngữ.

Điều gì sẽ xảy ra nếu tôi muốn sử dụng một hàm cú pháp ngắn cho sự trở lại ngầm định và ngắn gọn của nó (trong một số ngữ cảnh mà toàn bộ function (..) { return ...}sẽ hơi khó đọc hơn), nhưng tôi muốn sử dụng thistrong hàm của mình để tham chiếu đến ngữ cảnh gọi? Không có cách nào để làm điều này.

CoffeeScript có cả hai chức năng ->=>kiểu, và rõ ràng ES6 đã mượn =>kiểu từ đó. Vì vậy, câu hỏi của tôi là, tại sao ES6 không mượn ->phong cách?


Các hàm mũi tên béo có những khác biệt khác, giống như chúng không thể liên kết arguments.
DeadMG

Nếu đôi khi tất cả những gì bạn muốn là phạm vi xung quanh, bạn luôn có thể liên kết thisvới bao đóng trong một khai báo hàm đầy đủ. Đây có thể không phải là phần bạn quan tâm mặc dù.
Ben

Câu trả lời:


25

Xem đề xuất để thêm các chức năng mũi tên: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_feft_syntax 1

Những gì nó nói là:

Tuy nhiên, chúng tôi không muốn CoffeeScript ->, thật khó hiểu khi có hai mũi tên và năng động ràng buộc này là một khẩu súng ngắn.

Bạn cũng có thể xem một số cuộc thảo luận về phiên bản đề xuất trước đó cũng có cú pháp ->: https://esdiscuss.org/topic/arrow-feft-syntax-simplified

Nó xuất hiện để đi xuống như sau:

  1. Có hai cú pháp mũi tên với ngữ nghĩa khác nhau tinh tế sẽ làm tăng sự phức tạp và nhầm lẫn.
  2. Tính năng động ràng buộc này của hàm () và ->được coi là hiếm khi hữu ích, và một khẩu súng ngắn.
  3. Nếu bạn thực sự cần động ràng buộc này, bạn vẫn có thể sử dụng hàm (), có một cú pháp phím tắt không hữu ích lắm.

1
+1. Đặc biệt lưu ý rằng ES6 là nỗ lực thứ hai trong việc giới thiệu các tính năng này, vốn được lên kế hoạch ban đầu để đưa vào ES4, nhưng thông số kỹ thuật đã bị bỏ qua khi rõ ràng rằng các bên liên quan chính cho rằng nó quá phức tạp và có khả năng phá vỡ khả năng tương thích ngược. Giữ mọi thứ đơn giản nhất có thể phải là một mục tiêu quan trọng cho ủy ban lần này.
Jules

1
Cảm ơn câu trả lời của bạn nhưng tôi không nghĩ rằng nó bao gồm nó. Ít hơn không có nghĩa là đơn giản hơn; Tôi cho rằng sẽ phức tạp hơn khi phải chuyển đổi giữa hai cú pháp hàm rất khác nhau chỉ để có được logic ràng buộc khác nhau này (so với chuyển đổi một ký tự đơn). Có "nhiều loại chức năng với ngữ nghĩa khác nhau" không phải là một ý tưởng tồi; đó chính xác là những gì chúng ta có trong thực tế. Và tôi không thấy khả năng tương thích ngược có liên quan gì với bất cứ điều gì chúng ta đang nói đến. Tôi không đề nghị họ nên xóa hỗ trợ cho cú pháp hàm cổ điển, nếu đó là ý bạn
callum

2
@callum, sự đồng thuận (ít nhất là trong số những người đưa ra quyết định này) là function()phong cách ràng buộc này là một sai lầm và là một vấn đề về ngôn ngữ. Nếu có thể, họ sẽ thay đổi function()để có =>ngữ nghĩa, nhưng họ không thể vì điều đó sẽ phá vỡ tính tương thích ngược.
Winston Ewert

2
@WinstonEwert chờ đợi, bạn có nói rằng những người đưa ra quyết định sẽ thích hơn nếu họ có thể thay đổi function()để kế thừa thistừ phạm vi xung quanh như thế =>nào không? Trong trường hợp đó, sẽ không thischỉ đề cập đến các đối tượng toàn cầu ở khắp mọi nơi? Nghe có vẻ lạ. Nơi mà bạn đã nghe thấy không?
Callum

3
Điều này có thể có một câu trả lời được chấp nhận, nhưng nó có vẻ như thiết kế ngôn ngữ kém. Nếu bạn có một ngôn ngữ đòi hỏi một mũi tên béo, thì cũng nên có một mũi tên mỏng. Cái trước buộc mọi người phải bắt đầu suy nghĩ về các đối tượng, trong khi cái sau thừa nhận lịch sử javascripts của thiết kế chức năng trước và bối cảnh bị trì hoãn.
Lõi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.