Logo InterData
  • Trang chủ
  • Blog
    • Máy chủ (Server)
    • Máy chủ ảo (VPS)
    • Cloud Server
    • Web Hosting
    • Website
    • Trí tuệ nhân tạo (AI)
    • Lập trình
  • Dịch vụ
    • Thuê chỗ đặt máy chủ
    • Thuê Cloud Server
    • Thuê Hosting
    • Thuê máy chủ
    • Thuê VPS
  • Sự kiện
  • Khuyến Mãi
  • Trang chủ
  • Blog
    • Máy chủ (Server)
    • Máy chủ ảo (VPS)
    • Cloud Server
    • Web Hosting
    • Website
    • Trí tuệ nhân tạo (AI)
    • Lập trình
  • Dịch vụ
    • Thuê chỗ đặt máy chủ
    • Thuê Cloud Server
    • Thuê Hosting
    • Thuê máy chủ
    • Thuê VPS
  • Sự kiện
  • Khuyến Mãi
Trang Chủ Lập trình

Closure là gì trong JavaScript? Chi tiết A-Z + Ví dụ dễ hiểu

Trên hành trình chinh phục JavaScript, có một khái niệm nền tảng cực kỳ mạnh mẽ nhưng thường khiến không ít lập trình viên cảm thấy bối rối: đó chính là Closure. Hiểu rõ Closure là gì không chỉ giúp bạn viết code hiệu quả hơn mà còn mở ra cánh cửa để làm việc với nhiều kỹ thuật và Design Pattern quan trọng trong JavaScript hiện đại. Đọc bài viết để cùng tìm hiểu về Closure, các đặc điểm, ưu nhược điểm, cho đến những ứng dụng thực tế của Closure trong JavaScript. Đọc ngay!

NỘI DUNG

Toggle
  • Closure là gì?
  • Tại sao JavaScript Closures lại quan trọng
  • Ví dụ minh họa về Closure trong JavaScript
  • Các đặc điểm của Closure trong JavaScript
  • Ưu và nhược điểm của Closures trong JavaScript
    • Ưu điểm của JavaScript Closures
    • Nhược điểm của JavaScript Closures
  • Các trường hợp sử dụng Closure phổ biến
    • Tạo biến "Private" bằng Closure
    • Module Pattern cổ điển
    • Sử dụng Closure trong Callback và Event Handler
    • Currying và Partial Application
    • Factory Functions
  • 5 điều trong JavaScript Closures
  • Các câu hỏi thường gặp về Closure trong JavaScript
    • Closure khác gì Scope?
    • Sử dụng Closure có gây rò rỉ bộ nhớ không?
    • Vấn đề thường gặp với Closure trong vòng lặp là gì?

Closure là gì?

Closure trong JavaScript được tạo ra khi một hàm được định nghĩa bên trong một hàm khác, cho phép hàm bên trong truy cập các biến và tham số của hàm bên ngoài, ngay cả khi hàm bên ngoài đã được thực thi xong. Điều này xảy ra vì hàm bên trong vẫn giữ một tham chiếu đến môi trường từ vựng (lexical environment) nơi nó được tạo ra, tức là nó “ghi nhớ” trạng thái của hàm bao quanh tại thời điểm được khai báo.

Hiểu một cách đơn giản, closure cho phép một hàm có thể truy cập các biến thuộc phạm vi bên ngoài của nó, ngay cả sau khi phạm vi đó đã kết thúc.

Closure là gì trong JavaScript
Closure là gì trong JavaScript

Tại sao JavaScript Closures lại quan trọng

  • Tính đóng gói (Encapsulation): Closures cho phép đóng gói các biến trong phạm vi của một hàm, từ đó giúp tổ chức mã tốt hơn và bảo mật dữ liệu hiệu quả hơn.
  • Duy trì dữ liệu (Data Persistence): Closures cho phép các hàm bên trong tiếp tục truy cập vào các biến của hàm bên ngoài ngay cả khi hàm bên ngoài đã thực thi xong, giúp duy trì trạng thái dữ liệu.
  • Tính mô-đun (Modularity): Closures giúp tạo ra mã có tính mô-đun và dễ tái sử dụng, bằng cách cho phép các hàm truy cập vào dữ liệu và hành vi riêng tư.
  • Lập trình hàm (Functional Programming): Closures đóng vai trò quan trọng trong các mô hình lập trình hàm, hỗ trợ các kỹ thuật như hàm bậc cao (higher-order functions), kết hợp hàm (function composition), currying và nhiều kỹ thuật khác.
  • Xử lý bất đồng bộ (Asynchronous Operations): Closures thường được sử dụng trong lập trình bất đồng bộ để quản lý trạng thái và dữ liệu trong các callback hoặc promise.
  • Xử lý sự kiện (Event Handling): Closures rất cần thiết trong việc xử lý sự kiện của JavaScript, giúp gán các trình lắng nghe sự kiện (event listeners) mà vẫn có quyền truy cập vào các biến cục bộ và tham số.
  • Quản lý bộ nhớ (Memory Management): Closures hỗ trợ quản lý bộ nhớ hiệu quả bằng cách tự động xử lý vòng đời của biến và tránh các rò rỉ bộ nhớ.

Ví dụ minh họa về Closure trong JavaScript

Ví dụ minh họa đơn giản nhất:

JavaScript

function outerFunction() {
  let outerVariable = 'Hello Closure!';

  function innerFunction() {
    console.log(outerVariable); // innerFunction có thể truy cập outerVariable
  }

  return innerFunction; // Trả về innerFunction (closure)
}

const myClosure = outerFunction();
myClosure(); // Khi gọi myClosure() ở đây, nó vẫn in ra 'Hello Closure!'
                 // dù outerFunction() đã thực thi xong.

Giải thích:

myClosure là một closure. Nó là hàm innerFunction cùng với môi trường phạm vi của outerFunction (bao gồm outerVariable).

Ví dụ về Counter (Illustrating private state):

JavaScript

function createCounter() {
  let count = 0; // Đây là biến "private"

  return {
    increment: function() {
      count++;
      console.log(count);
    },
    decrement: function() {
      count--;
      console.log(count);
    },
    getCount: function() {
      return count;
    }
  };
}

const counter1 = createCounter();
counter1.increment(); // 1
counter1.increment(); // 2
console.log(counter1.getCount()); // 2

const counter2 = createCounter(); // Một instance closure khác
counter2.increment(); // 1 (count của counter2 độc lập với counter1)

Giải thích:

Mỗi lần gọi createCounter(), một closure mới được tạo ra với biến count riêng. Các hàm increment, decrement, getCount bên trong truy cập và thao tác với biến count đó. Biến count không thể truy cập trực tiếp từ bên ngoài, tạo ra hiệu ứng “biến private”.

XEM THÊM:  Đối số (Argument) là gì? Cách dùng & Phân biệt Tham số

Ví dụ về vấn đề phổ biến với vòng lặp và cách sử dụng Closure để khắc phục:

JavaScript

// Vấn đề thường gặp với var trong vòng lặp (KHÔNG dùng Closure)
// for (var i = 0; i < 3; i++) {
//   setTimeout(function() {
//     console.log(i); // Luôn in ra 3, không phải 0, 1, 2
//   }, 100 * i);
// }

// Khắc phục bằng Closure (sử dụng IIFE hoặc let/const)
for (var i = 0; i < 3; i++) {
  (function(index) { // IIFE tạo scope mới cho mỗi lần lặp
    setTimeout(function() {
      console.log(index); // In ra 0, 1, 2
    }, 100 * index);
  })(i); // Truyền giá trị i vào scope mới
}

// Cách hiện đại hơn với let/const (tự động tạo closure/scope cho mỗi lần lặp)
for (let j = 0; j < 3; j++) {
   setTimeout(function() {
     console.log(j); // In ra 0, 1, 2
   }, 100 * j);
}

Giải thích:

Với var, biến i có phạm vi toàn cục hoặc hàm. Hàm setTimeout bên trong closure tham chiếu đến cùng một biến i. Khi setTimeout callback thực thi, vòng lặp đã kết thúc và i có giá trị cuối cùng (3).

Bằng cách sử dụng IIFE (Immediately Invoked Function Expression) hoặc đơn giản là let/const trong vòng lặp for (từ ES6), chúng ta tạo ra một phạm vi mới cho mỗi lần lặp, và closure bên trong ghi nhớ giá trị của biến trong phạm vi cụ thể đó.

Các đặc điểm của Closure trong JavaScript

Sau khi hiểu định nghĩa cơ bản Closure là gì và các ví dụ của Closure, điều quan trọng là nắm được những đặc điểm cốt lõi tạo nên Closure. Đây là những tính chất giúp phân biệt và hiểu rõ cách Closure hoạt động trong thực tế lập trình JavaScript.

Đặc điểm then chốt nhất là khả năng của một hàm “ghi nhớ” và truy cập vào các biến từ phạm vi bên ngoài (outer scope) nơi nó được khai báo. Khả năng này vẫn tồn tại bền vững ngay cả sau khi hàm bên ngoài đã kết thúc quá trình thực thi của mình.

Chính là việc duy trì liên kết đến môi trường phạm vi từ vựng (Lexical Scope) của hàm cha. Lexical Scope xác định biến nào có thể được truy cập dựa trên vị trí code, và closure bảo tồn môi trường này.

Các đặc điểm của Closure trong JavaScript
Các đặc điểm của Closure trong JavaScript

Một đặc điểm quan trọng khác là sự kết hợp giữa hàm đó và môi trường phạm vi của nó. Closure không chỉ là mã lệnh của hàm con, mà còn là “túi đồ” chứa các biến từ phạm vi cha mà nó có quyền truy cập.

Hơn nữa, mỗi lần gọi hàm bên ngoài tạo ra một phiên bản closure độc lập. Mỗi phiên bản closure này sẽ có một tập hợp các biến từ phạm vi cha riêng biệt, không chia sẻ trạng thái với các instance closure khác.

Nhờ những đặc điểm độc đáo này, Closure mang lại sức mạnh to lớn trong việc quản lý trạng thái và tạo ra các cấu trúc dữ liệu phức tạp trong JavaScript. Đây là nền tảng cho nhiều kỹ thuật lập trình hiện đại.

Việc nắm rõ các đặc điểm này là bước đệm quan trọng để hiểu sâu hơn về cơ chế hoạt động của Closure và cách áp dụng nó qua các ví dụ cụ thể mà chúng ta sẽ khám phá tiếp theo.

Ưu và nhược điểm của Closures trong JavaScript

Ưu điểm của JavaScript Closures

  • Đóng gói dữ liệu: Closures cho phép tạo ra các biến và phương thức riêng tư, giúp bảo mật dữ liệu và ngăn chặn việc truy cập hay thay đổi không mong muốn.
  • Tính linh hoạt: Closures mang đến sự linh hoạt trong thiết kế mã bằng cách cho phép tạo các hàm và hành vi đặc biệt phù hợp với từng yêu cầu cụ thể.
  • Tái sử dụng mã: Closures giúp tăng khả năng tái sử dụng mã bằng cách đóng gói các mẫu hành vi phổ biến vào trong các hàm có thể sử dụng lại.
  • Giảm ô nhiễm phạm vi toàn cục: Closures giúp giảm việc khai báo biến hoặc hàm trong phạm vi toàn cục, từ đó tránh xung đột và tăng tính ổn định của chương trình.

Nhược điểm của JavaScript Closures

  • Tiêu tốn bộ nhớ: Closures có thể tiêu tốn nhiều bộ nhớ hơn, đặc biệt khi chúng giữ tham chiếu đến các đối tượng lớn hoặc biến sống lâu.
  • Tăng chi phí hiệu năng: Trong một số trường hợp, closures có thể làm giảm hiệu năng, nhất là khi được tạo liên tục bên trong các khối mã được thực thi thường xuyên hoặc có nhiều hàm lồng nhau.
  • Rò rỉ bộ nhớ: Closures có thể giữ lại tham chiếu đến biến không cần thiết, dẫn đến tiêu tốn thêm bộ nhớ hoặc rò rỉ nếu không giải phóng đúng.
  • Khó debug hơn: Việc sử dụng closures, đặc biệt là khi chúng được lồng nhau hoặc giữ các biến có thể thay đổi, có thể gây khó khăn trong quá trình gỡ lỗi.
  • Gây ô nhiễm chuỗi phạm vi (scope chain): Closures có thể vô tình giữ lại tham chiếu đến các biến vượt ra ngoài vòng đời dự kiến, dẫn đến hành vi không mong đợi hoặc rò rỉ bộ nhớ.
XEM THÊM:  Hàm ẩn danh (Anonymous Function/Lambda): Cú pháp & Ví dụ dễ hiểu

Các trường hợp sử dụng Closure phổ biến

Bạn đã hiểu Closure là gì và cách nó hoạt động. Giờ là lúc khám phá sức mạnh thực tế của nó. Closure không chỉ là lý thuyết, mà được ứng dụng cực kỳ phổ biến trong các kỹ thuật lập trình JavaScript hiện đại hàng ngày.

Chính nhờ khả năng “ghi nhớ” môi trường phạm vi nơi nó được tạo ra, Closure cho phép chúng ta giữ lại và thao tác với dữ liệu (biến, hàm) từ bên ngoài. Đặc điểm này là chìa khóa cho nhiều ứng dụng thực tế quan trọng, giúp code linh hoạt và có cấu trúc hơn.

Dưới đây là một số trường hợp và kỹ thuật lập trình phổ biến mà Closure đóng vai trò cốt lõi. Việc hiểu rõ chúng sẽ giúp bạn áp dụng Closure một cách hiệu quả và tự tin hơn trong các dự án JavaScript thực tế của mình.

Tạo biến “Private” bằng Closure

Closure là cách phổ biến để tạo ra biến “private” trong JavaScript, vốn không hỗ trợ modifier private truyền thống như các ngôn ngữ khác. Biến được khai báo trong hàm ngoài, và hàm con (closure) được trả về có thể truy cập biến đó.

Từ bên ngoài, biến này không thể bị truy cập trực tiếp, chỉ thông qua các hàm public được trả về. Điều này giúp bảo vệ dữ liệu và kiểm soát quyền truy cập. Ví dụ kinh điển là hàm tạo counter.

Module Pattern cổ điển

Module Pattern là một mẫu thiết kế phổ biến sử dụng Closure để đóng gói (encapsulate) code và dữ liệu. Nó cho phép giữ các biến và hàm ở chế độ “private” bên trong module, chỉ hiển thị ra bên ngoài một giao diện công khai (public API) thông qua đối tượng được trả về.

Closure bảo toàn trạng thái private này giữa các lần gọi hàm trong module, tạo ra các module độc lập, dễ quản lý.

Các trường hợp sử dụng Closure phổ biến
Các trường hợp sử dụng Closure phổ biến

Sử dụng Closure trong Callback và Event Handler

Callback functions và các hàm xử lý sự kiện (event handlers) thường được thực thi không đồng bộ (asynchronously) hoặc ở một ngữ cảnh khác. Closure cho phép các hàm này “ghi nhớ” môi trường và các biến cục bộ nơi chúng được tạo ra.

Điều này đảm bảo khi callback được gọi sau này, nó vẫn có quyền truy cập vào dữ liệu cần thiết từ phạm vi ban đầu. Ví dụ phổ biến là trong setTimeout hoặc khi lặp qua các phần tử và gắn event listener mà cần truy cập biến chỉ mục.

Currying và Partial Application

Trong lập trình hàm (functional programming), Currying và Partial Application là các kỹ thuật biến đổi hàm dựa trên Closure. Chúng cho phép bạn tạo ra các hàm mới bằng cách “ghi nhớ” một hoặc nhiều đối số ban đầu thông qua Closure. Hàm mới này sau đó chờ các đối số còn lại để thực thi. Closure lưu giữ các đối số đã truyền giữa các lần gọi.

Factory Functions

Factory Function là hàm tạo ra và trả về các đối tượng. Closure thường được sử dụng bên trong Factory Function để quản lý trạng thái nội bộ (internal state) cho từng đối tượng được tạo ra.

Mỗi đối tượng được trả về có thể có các phương thức bên trong sử dụng closure để truy cập và thay đổi trạng thái riêng của nó, tách biệt với các đối tượng khác từ cùng factory.

5 điều trong JavaScript Closures

  • Phạm vi từ vựng (Lexical Scope): Closures trong JavaScript tuân theo quy tắc phạm vi từ vựng, nghĩa là phạm vi của một biến được xác định dựa trên vị trí của nó trong mã nguồn.
  • Thu gom rác (Garbage Collection): Closures có thể ảnh hưởng đến quá trình thu gom rác trong JavaScript, vì các biến được tham chiếu trong closures sẽ không bị thu gom cho đến khi closure không còn được truy cập nữa.
  • Ràng buộc biến (Binding): Closures giữ lại tham chiếu đến các biến trong phạm vi bên ngoài tại thời điểm closure được tạo ra, chứ không phải tại thời điểm nó được thực thi.
  • Ngữ cảnh (Context): Closures không chỉ ghi nhớ các biến trong phạm vi bên ngoài mà còn giữ lại ngữ cảnh khi chúng được tạo ra, bao gồm cả giá trị của this tại thời điểm đó.
  • Tính linh hoạt (Dynamic Nature): Closures trong JavaScript rất linh hoạt và có thể thay đổi hành vi cũng như các biến được giữ lại ngay trong thời gian chạy (runtime).
XEM THÊM:  Matplotlib là gì? A-Z về thư viện Matplotlib trong Python

Closures là một khái niệm cốt lõi trong JavaScript, đóng vai trò quan trọng và mang lại nhiều ứng dụng thực tiễn trong phát triển web hiện đại. Chúng cho phép lập trình viên viết mã sạch hơn, có cấu trúc rõ ràng và hiệu quả hơn thông qua việc đóng gói biến và hành vi bên trong phạm vi của hàm.

Các câu hỏi thường gặp về Closure trong JavaScript

Closure khác gì Scope?

Mối quan hệ giữa Closure và Scope là một trong những điểm dễ nhầm lẫn. Hiểu đơn giản, Scope (phạm vi) là nơi biến được định nghĩa và có thể truy cập tại một thời điểm nhất định trong code. JavaScript có Global Scope, Function Scope và Block Scope (với let, const).

Còn Closure lại là khả năng của một hàm ghi nhớ và truy cập cái Scope bên ngoài (Lexical Scope) nơi nó được tạo ra, ngay cả khi Scope đó không còn hoạt động (ví dụ: hàm cha đã chạy xong). Closure dựa trên Scope, nhưng nó là một cơ chế duy trì quyền truy cập đó qua thời gian và ngữ cảnh khác nhau.

Sử dụng Closure có gây rò rỉ bộ nhớ không?

Có, sử dụng Closure không cẩn thận có thể dẫn đến rò rỉ bộ nhớ (memory leak). Rò rỉ xảy ra khi một Closure giữ tham chiếu đến các đối tượng lớn trong phạm vi cha mà thực tế không cần dùng đến, khiến chúng không được giải phóng bởi Garbage Collector (bộ dọn rác tự động của JS).

Để tránh rò rỉ, hãy đảm bảo rằng các tham chiếu đến Closure (ví dụ: event listener gắn vào DOM element) được dọn dẹp (unmounted/removed) khi không cần thiết nữa. Trong hầu hết các trường hợp sử dụng Closure thông thường và đúng cách, JavaScript Engine đủ thông minh để chỉ giữ lại những biến mà Closure thực sự cần, giảm thiểu nguy cơ rò rỉ.

Vấn đề thường gặp với Closure trong vòng lặp là gì?

Vấn đề kinh điển xảy ra khi sử dụng var trong vòng lặp for để tạo ra một loạt các hàm (ví dụ: với setTimeout hoặc gắn event listener). Biến i được khai báo với var có phạm vi là toàn bộ hàm hoặc global, không phải phạm vi khối cho mỗi lần lặp.

Kết quả là tất cả các hàm Closure được tạo ra trong vòng lặp đều tham chiếu đến cùng một biến i duy nhất. Khi các hàm này thực thi sau này, biến i đã có giá trị cuối cùng của vòng lặp. Do đó, tất cả các Closure đều truy cập và sử dụng cùng giá trị cuối cùng đó, không phải giá trị i của từng lần lặp riêng biệt.

Cách khắc phục là sử dụng let hoặc const thay cho var trong vòng lặp (từ ES6 trở đi). let và const có phạm vi khối (block scope), tạo ra một biến i mới cho mỗi lần lặp. Nhờ đó, mỗi Closure sẽ ghi nhớ giá trị i đúng của lần lặp mà nó được tạo ra.

InterData đã cùng bạn tìm hiểu tầm quan trọng của closures và nhấn mạnh vai trò của chúng. Closures giúp lập trình viên xây dựng mã nguồn linh hoạt, dễ tái sử dụng và đảm bảo tính riêng tư cho dữ liệu, từ đó nâng cao khả năng tổ chức và hiệu quả của mã nguồn.

Bạn đang dành tâm huyết học và áp dụng Closure để xây dựng những tính năng mạnh mẽ, tối ưu hiệu suất cho dự án JavaScript của mình. Để những “đứa con tinh thần” này hoạt động online một cách mượt mà, ổn định và tiếp cận được người dùng, bạn cần một nền tảng hạ tầng đáng tin cậy. InterData cung cấp dịch vụ thuê VPS với phần cứng thế hệ mới như CPU AMD EPYC/Intel Xeon Platinum và SSD NVMe U.2, đảm bảo hiệu năng vượt trội cho website và ứng dụng của bạn.

Nếu dự án của bạn là các ứng dụng Node.js Backend, API, hoặc cần môi trường linh hoạt, cấu hình mạnh mẽ hơn, hãy cân nhắc thuê VPS Linux tại InterData.

Share187Tweet117
Mỹ Y
Mỹ Y

Nguyễn Thị Mỹ Y - Tốt nghiệp chuyên ngành Marketing thương mại với 2+ năm kinh nghiệm trong lĩnh vực Content Công Nghệ và Phần Mềm. Hiện tại, tôi đang đảm nhiệm vị trí Nhân viên Digital Marketing tại InterData - một trong những công ty hàng đầu về giải pháp công nghệ thông tin tại Việt Nam, nơi tôi có cơ hội làm việc với các chuyên gia hàng đầu trong ngành công nghệ thông tin. Với vai trò là một nhân viên Digital Marketing, tôi có cơ hội được tham gia vào các dự án phát triển nội dung chất lượng cao về phần mềm mã nguồn mở, ứng dụng và giải pháp công nghệ hữu ích. Để không ngừng nâng cao chuyên môn, tôi thường xuyên tham gia các buổi workshop, khóa đào tạo chuyên sâu và tự học hỏi các xu hướng mới trong lĩnh vực công nghệ thông tin. Tôi tin rằng việc chia sẻ kiến thức mới mẻ là chìa khóa để xây dựng một cộng đồng công nghệ vững mạnh và phát triển. Với kiến thức chuyên sâu, kinh nghiệm thực tế và tâm huyết với nghề, tôi hy vọng có thể đóng góp một phần nhỏ vào sự phát triển của ngành công nghệ thông tin Việt Nam.

KHUYẾN MÃI NỔI BẬT
VPS InterData tích hợp sẵn n8n
VPS InterData Tích Hợp Sẵn n8n – Cài Đặt Nhanh Trong 1-Click
BÀI VIẾT MỚI NHẤT
AJAX là gì - Lợi ích - Hạn chế & Các công nghệ cấu thành AJAX
AJAX là gì? Lợi ích – Hạn chế & Các công nghệ cấu thành AJAX
CRUD là gì - Tổng quan về CRUD (Create, Read, Update, Delete)
CRUD là gì? Tổng quan về CRUD (Create, Read, Update, Delete)
AI Agent là gì
AI Agent là gì? Khái niệm, Cách hoạt động & Ứng dụng 2025
Closure là gì trong JavaScript - Chi tiết A-Z + Ví dụ dễ hiểu
Closure là gì trong JavaScript? Chi tiết A-Z + Ví dụ dễ hiểu
Hàm ẩn danh (Anonymous Function,Lambda) Cú pháp & Ví dụ dễ hiểu
Hàm ẩn danh (Anonymous Function/Lambda): Cú pháp & Ví dụ dễ hiểu
Giá thuê Hosting 1 năm
Giá thuê Hosting 1 năm: Lợi ích, Các yếu tố ảnh hưởng
Các loại Web Hosting
Các loại Web Hosting phổ biến và hướng dẫn lựa chọn chi tiết
Băng thông Web Hosting
Băng thông Web Hosting là gì? Vai trò, Cách tính & Cách tối ưu
Functional Programming là gì - A-Z về FP code sạch, dễ test
Functional Programming là gì? A-Z về FP code sạch, dễ test

logo interdata

VPĐD: 240 Nguyễn Đình Chính, P.11. Q. Phú Nhuận, TP. Hồ Chí Minh
VPGD: 211 Đường số 5, Lakeview City, An Phú, Thủ Đức, TP. Hồ Chí Minh
MST: 0316918910 – Cấp ngày 28/06/2021 – tại Sở KH và ĐT TP. HCM
Mã ĐDKD: 0001
Điện thoại: 1900.636822
Website: Interdata.vn

DỊCH VỤ

Thuê chỗ đặt máy chủ
Thuê Cloud Server
Thuê Hosting
Thuê máy chủ
Thuê VPS

THÔNG TIN

Blog
Giới thiệu
Liên hệ
Khuyến mãi
Sự kiện

CHÍNH SÁCH

Chính sách bảo hành
Chính sách bảo mật
Chính sách xử lý khiếu nại
Cam kết dịch vụ
Điều khoản sử dụng
GDPR
Hình thức thanh toán
Hướng dẫn thanh toán trên VNPAY
Quy định đổi trả và hoàn trả tiền
Quy định sử dụng tên miền