Dừng sử dụng IIFEs trong js

Dừng sử dụng IIFEs trong js

[translate]Stop Using IIFEs in JavaScript

Nội dung

Các hàm được thực thi ngay lập tức (invoked function) - còn được gọi là IIFEs, là một trong số các trick từ lâu trong js để bù đắp cho viêc thiếu các biến private và namspace. Trong các dự án lớn các file, biến có thể bị trùng tên mà không có cách nào giới hạn. vì vậy IIFE được tạo ra. Tuy nhiên, Js đã phát triển, vấn đề này đã có cách giải quyết được tích hợp trong js, vì vậy liệu rằng IIFE có còn cần thiết nữa không.

IIFE là gì?

Trước khi chúng ta có thể nói về tính hữu ích của IIFE, trước tiên chúng ta cần hiểu cách chúng hoạt động. Dưới đây là ví dụ cơ bản về IIFE.

(function() {
  var x = 1
  // Do something
})()

console.log(x)
// Throws an error since x is not accessible

Trong đoạn code phía trên, chúng ta tạo một function định nghĩa 1 biến x sử dụng từ khóa var. Thông thường điều này sẽ tạo 1 biến x với giá trị được cung cấp và nó có thể sử dụng ở bất kỳ đâu trong file, nhưng khi chung sta bao bọc chúng bằng 1 function ()() thì nó sẽ thực hiên ngay lập tức. Điều này khiến tất cả các biến được định nghĩa trong biểu thức đó chỉ có thể truy cập được trong hàm (hàm được thực thi ngay lập tức - biến được khai báo và sau khi hàm chạy hết thì cũng hủy luôn biến này, cho nên bên ngoài hàm sẽ không còn truy cập được biến nữa). Điều này cung cấp cho chúng ta khả năng tạo 1 phần mã chạy 1 cách riêng tư, ngay lập tức và không truy cập được từ bất cứ chỗ nào.

Các lựa chọn thay thế IIFE

Cú pháp này khá rắc rối và có thể gây ra các lỗi với cách js xử lý chèn dấu ; tự động. Tuy nhiên có các cách khác để giải quyết việc này.

Block scoped

Nếu mục đích là để tạo đoạn code sử dụng một số biến trong phạm vi thì có thể sử dụng biến block-scoped. Js đã giới thiệu 2 từ khóa là letconst.

{
  let x = 1
  // Do something
}

console.log(x)
// Throws an error since x is not accessible

Lý do điều này hoạt động là bởi vì x được khai báo trong 1 block được chỉ định bởi dấu {}. Điều này có nghĩa là x chỉ dùng được bên trong các block và không thể truy cập bởi bên ngoài (khác với var các biến sẽ được truy cập ở toàn bộ file.

Modules

Xa hơn nữa cách tốt nhất để xử lý biến và hàm private là xử dụng dạng module. Export một biến hoặc 1 hàm từ 1 module là cách duy nhất để có thể truy cập nó từ bên ngoài file hoặc module đó, nghĩa là mỗi module hoạt động như một không gian namspace riêng của nó.

// module.js
let x = 20
export let y = 10

import { y } from './module.js'

console.log(y)
// 10

import { x } from './module.js'

console.log(x)
// Error since x is not exported from module.js

Đây là cách tôi khuyến khích mọi người sử dụng khi xử lý các biến private làm cho công việc đơn giản hơn, thân thiện hơn. (var -> const or let, export -> import).

Kết luận

Lần tới khi bạn cần tạo các biến, thay vì chọn IIFE, hãy sử dụng mô-đun hoặc let, const để hoàn thành nhiệm vụ tương tự theo cách rõ ràng và dễ hiểu hơn.


Nguồn: javascript.plainenglish.io/stop-using-immed..