Bỏ qua để đến nội dung

IIFE (Immediately Invoked Function Expression)

IIFE (Immediately Invoked Function Expression) là một function expression được định nghĩa và gọi ngay lập tức tại chỗ, không cần đặt tên rồi gọi ở dòng khác.

(function () {
console.log("Chạy ngay!");
})();

(function () {
// code chạy ngay
})();

1. Tạo scope riêng — tránh ô nhiễm global

Phần tiêu đề “1. Tạo scope riêng — tránh ô nhiễm global”
var x = 1;
(function () {
var x = 2; // x chỉ tồn tại trong IIFE
console.log("Trong IIFE:", x); // 2
})();
console.log("Ngoài IIFE:", x); // 1 ← không bị ảnh hưởng
const counter = (function () {
let count = 0; // "private" — không truy cập được từ bên ngoài
return {
inc() {
count++;
return count;
},
get() {
return count;
},
};
})();
console.log(counter.inc()); // 1
console.log(counter.inc()); // 2
console.log(counter.get()); // 2
console.log(counter.count); // undefined — không truy cập được!
// Mỗi thư viện tự bọc trong IIFE → không xung đột biến
(function ($) {
// $ ở đây chắc chắn là jQuery
$(".btn").click(function () { ... });
})(jQuery);

Trước ES6

  • Chưa có let, constvar không có block scope
  • Chưa có module → dùng IIFE để tạo private scope
  • IIFE là cách duy nhất để đóng gói code

Sau ES6

  • let, constblock scope → dùng {} là đủ
  • ES Modules (import/export) thay thế IIFE
  • IIFE vẫn hữu ích cho async top-levellegacy code
(function () {
var secret = 42;
console.log(secret);
})();
// secret không tồn tại ở đây

Ngoài cách phổ biến nhất, còn có vài cách viết khác (ít dùng):

// Cách 1: phổ biến nhất
(function () { ... })();
// Cách 2: gọi bên trong ()
(function () { ... }());
// Cách 3: dùng toán tử unary
!function () { ... }();
void function () { ... }();
+function () { ... }();

Đặc điểmChi tiết
Cú pháp(function () { ... })(); hoặc (() => { ... })();
Mục đíchTạo scope riêng, closure, dữ liệu private
Tham sốTruyền qua () cuối cùng
Async(async () => { ... })();
Thay thế hiện đạilet/const block scope, ES Modules
Vẫn hữu íchAsync IIFE, tương thích legacy, đóng gói nhanh