Tại sao sử dụng `const foo = () => {}` thay vì `function foo () {}`


12

Ví dụ: trong video Redux này , người hướng dẫn luôn sử dụng cú pháp như

const counter = (state=0, action) => {
   ... function body here
}

nơi tôi sẽ chỉ sử dụng "truyền thống"

function counter(state=0, action) {
   ... function body here
}

Mà thực sự ngắn hơn và, IMO, rõ ràng hơn. Thật dễ dàng để quét cạnh trái khá đều và có cấu trúc của trang cho từ "hàm" hơn là quét cạnh phải raggedy cho một "=>" nhỏ.

Khác với this, và cố gắng để khách quan, không phải ý kiến, có một số khác biệt hữu ích hoặc lợi thế cho cú pháp mới lạ?


3
Câu hỏi này trên StackOverflow có thể khiến bạn quan tâm: stackoverflow.com/questions 432361379/ trên
Vincent Savard

3
Tôi không phải là chuyên gia JavaScript, nhưng tôi đoán constgiúp đảm bảo chức năng không được xác định lại sau này.
MetaFight

Cảm ơn @VincentSavard, điều đó thật hoàn hảo, và về cơ bản là những gì tôi mong đợi: Khác với "cái này" và nguyên mẫu / lớp, dường như không có sự khác biệt thực sự.
dùng949300

3
@ user949300 Có một sự khác biệt, là MetaFight đề cập đến. Ngoài ra, protype / "thứ này" cũng nhanh chóng trở thành điểm khác biệt quan trọng.
msanford

1
Câu chuyện dài: Bạn nên đánh giá rõ ràng và súc tích về lợi ích của trường hợp cạnh.
Wayne Bloss

Câu trả lời:


11

Các câu lệnh hàm (các hàm được đặt tên, cú pháp thứ 2 được hiển thị) được kéo lên trên cùng của phạm vi từ vựng đầy đủ, ngay cả các câu lệnh phía sau các khối điều khiển và tùy ý, như các ifcâu lệnh. Việc sử dụng const(như let) để khai báo một biến cung cấp cho nó phạm vi khối, dừng việc nâng toàn bộ (nâng lên khối đơn thuần) và đảm bảo nó không thể được khai báo lại.

Khi ghép các tập lệnh lại với nhau hoặc một số sử dụng các công cụ xây dựng gói khác, việc nâng chức năng có thể phá vỡ các tập lệnh xung đột theo những cách khó gỡ lỗi vì nó thất bại trong âm thầm. Một tuyên bố lại constsẽ đưa ra một ngoại lệ trước khi chương trình có thể chạy, do đó việc gỡ lỗi dễ dàng hơn nhiều.


Cảm ơn. câu trả lời tốt. Tôi đã chủ yếu làm việc trên các dự án JS nhỏ hơn hoặc các dự án máy chủ node.js nơi chúng có hệ thống mô-đun tốt để đặt tên. Nhưng chỉ bắt đầu vào một dự án phía khách hàng nhiều hơn bằng cách sử dụng các gói và đây là cái nhìn sâu sắc tốt.
dùng949300

2
Chỉ cần một lưu ý rằng eslint no-func-gán có thể bắt gặp vấn đề khai báo này.
dùng949300

2
Viết mã có các tín hiệu khó hiểu để có được lợi ích của ngôn ngữ gõ tĩnh là lý do để sử dụng Bản in, không phải const. IMO hơi thiển cận, để bắt đầu sử dụng constở mọi nơi vì lý do này trong thời đại eslint, webpack, babel và vv. Không ai kết nối các tệp với nhau một cách thủ công nữa trong ít nhất một thập kỷ nay.
Wayne Bloss

2

Đây là lý do tại sao bạn nên sử dụng function:

  1. Các tín hiệu rõ ràng và súc tích. Điều này có lợi hơn nhiều so với bất kỳ mối lo ngại nào về trường hợp cạnh được liệt kê trong câu trả lời khác.

  2. Bạn thực sự muốn nâng hàng trong các mô-đun vì như bạn có thể thấy từ mã bên dưới, việc consttuyên bố tryDoTheThingthất bại trong âm thầm và sẽ không bị bắt cho đến khi bạn cố gắng gọi nó.

  3. Hầu hết các đàn em mà tôi tiếp xúc bắt đầu sử dụng constđể khai báo mọi chức năng bởi vì đó là một mốt nhất thời, như sử dụng khoảng trắng trên các tab hoặc làm mọi thứ functional!!!vì "OOP xấu". Đừng làm vậy. Bạn không muốn trở thành kẻ theo đuổi mốt mà không hiểu đầy đủ ý nghĩa.

qua https://gist.github.com/stephenjfox/fec4c72c7f6ae254f31407295dc72074


/*
This shows that, because of block-scoping, const function references must be
invoked in-order or else things will fail silently.
const's are added the name space serially (in the order in which they appear)
and much of the body isn't declared when we first try to invoke or functions
*/


const tryDoTheThing = () => {
  console.log(`This is me trying to be awesome ${getAwesome()}`)
}


// "getAwesome is not defined", because it is referenced too early
tryDoTheThing() // comment to see the rest work


const getAwesome = () => (+((Math.random() * 10000).toString().split('.')[0]))


const doTheThing = () => {
  console.log(`This is awesome! ${getAwesome()}`)
}

doTheThing() // prints

đấu với

/*
Function declarations are given two passes, where the first lifts them to
the top of the namespace, allowing "out of order" usage
*/

doTheThing();


function doTheThing() {
  console.log(`This is awesome number ${getAwesome()}`)
}

function getAwesome() {
  return (+((Math.random() * 10000).toString().split('.')[0]))
}
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.