Serials Javascript Style Guide – Arrow Functions

  Javascript    —  2019, May 27    

Arrow Functions

8.1 Use them

Nếu thực sự phải dùng hàm vô danh (như khi truyền vào 1 callback), thì sử dụng hàm mũi tên. eslint: prefer-arrow-callback, arrow-spacing

Tại sao ư? Vì nó tạo ra 1 phiên bản của hàm thực thi trong ngữ cảnh của this, thường là những gì bạn muốn và là cú pháp ngắn gọn hơn.

Tại sao không? Nếu là hàm phức tạp thì nên chuyển nó thành hàm với tên riêng của hàm.

// bad
[1, 2, 3].map(function (x) {
  const y = x + 1;
  return x * y;
});

// good
[1, 2, 3].map((x) => {
  const y = x + 1;
  return x * y;
});

8.2 Implicit return

Nếu thân hàm chỉ bao gồm 1 câu lệnh trả về expression không có side effects thì bỏ qua dấu ngoặc và sử dụng implicit return (ngầm trả về). Mặc khác, thì vẫn dùng dấu ngoặc và lệnh return. eslint: arrow-parens, arrow-body-style

Tại sao ư? Đó là Syntactic sugar giúp dễ đọc hơn.

// bad
[1, 2, 3].map(number => {
  const nextNumber = number + 1;
  `A string containing the ${nextNumber}.`;
});

// good
[1, 2, 3].map(number => `A string containing the ${number + 1}.`);

// good
[1, 2, 3].map((number) => {
  const nextNumber = number + 1;
  return `A string containing the ${nextNumber}.`;
});

// good
[1, 2, 3].map((number, index) => ({
  [index]: number,
}));

// No implicit return with side effects
function foo(callback) {
  const val = callback();
  if (val === true) {
    // Do something if callback returns true
  }
}

let bool = false;

// bad
foo(() => bool = true);

// good
foo(() => {
  bool = true;
});

8.3 Paren wrap

Để dễ đọc thì hãy bọc nhiều line bởi dấu ngoặc đơn.

// bad
['get', 'post', 'put'].map(httpMethod => Object.prototype.hasOwnProperty.call(
    httpMagicObjectWithAVeryLongName,
    httpMethod,
  )
);

// good
['get', 'post', 'put'].map(httpMethod => (
  Object.prototype.hasOwnProperty.call(
    httpMagicObjectWithAVeryLongName,
    httpMethod,
  )
));

8.4 One arg parens

Nếu hàm có 1 tham số và không sử dụng dấu ngoặc, hãy bỏ dấu ngoặc đi. Nguoawcj lại, luôn sử dụng dấu ngoặc cho các tham số để cho rõ ràng và nhất quán. Chú ý: chấp nhận luôn sử dụng dấu ngoặc đơn trong trường hợp sử dụng “always” option với eslint. eslint: arrow-parens

Tại sao ư? Trông nó rõ ràng hơn.

// bad
[1, 2, 3].map((x) => x * x);

// good
[1, 2, 3].map(x => x * x);

// good
[1, 2, 3].map(number => (
  `A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`
));

// bad
[1, 2, 3].map(x => {
  const y = x + 1;
  return x * y;
});

// good
[1, 2, 3].map((x) => {
  const y = x + 1;
  return x * y;
});

8.5 Confusing

Tránh nhầm lẫn cú pháp hàm mũi tên (=>) với toán tử so sánh (<=, >=). eslint: no-confusing-arrow

// bad
const itemHeight = item => item.height <= 256 ? item.largeSize : item.smallSize;

// bad
const itemHeight = (item) => item.height >= 256 ? item.largeSize : item.smallSize;

// good
const itemHeight = item => (item.height <= 256 ? item.largeSize : item.smallSize);

// good
const itemHeight = (item) => {
  const { height, largeSize, smallSize } = item;
  return height <= 256 ? largeSize : smallSize;
};

8.6 Implicit arrow linebreak

Thực hiện vị trí thân hàm mũi tên với các trả về ngầm định. eslint: implicit-arrow-linebreak

// bad
foo =>
  bar;

foo =>
  (bar);

// good
foo => bar;
foo => (bar);
foo => (
   bar
)

Tổng hợp Serial Javascript Style Guide