Cảm ơn vutuanhien. Đó đúng là cách kinh điển được trình bày trong nhiều sách (có tác giả dùng $V_n = X\setminus U_n$ thay vì $U_n$ như ở trên, cũng tương đương nhau cả). Cách này cũng rất tự nhiên vì tìm cách xây dựng một phủ mở hữu hạn theo định nghĩa của tập compact.
Cách của anh dùng một tính chất "khác" của tập compact đó là mọi dãy trong $X$ tồn tại một dãy con hội tụ trong $X$.
Đặt $g_n = f_n-f$ như trên thì ta cần chứng minh $g_n$ hội tụ đều về $0$, nghĩa là $M_n\to 0$ với $M_n = \sup_{x\in X}|g_n(x)|$. Vì $X$ compact nên $\sup$ có thể đạt được, tức là tồn tại $x_n\in X$ sao cho $M_n = |g_n(x_n)|$. Vì $g_n\ge g_{n+1}$ và $g_n\to 0$ nên ta có $g_n\ge g_{n+1}\ge 0\forall n$. Lấy $\sup$ ta được $M_n\ge M_{n+1}\ge 0$, nghĩa là $(M_n)$ là một dãy giảm bị chặn dưới bởi $0$, nên nó có giới hạn $L\ge 0$. Ta cần chứng minh $L=0$.
Từ đây trở đi ta chỉ cần làm việc với một dãy con hội tụ $(x_k)_{k\in I}$ của $(x_n)$ (để cho đơn giản ta không cần viết rõ $k\in I$). Giả sử $x_k\to x^*\in X$. Với mọi $\epsilon > 0$, vì $g_n\searrow 0$ nên tồn tại $N$ sao cho $0\le g_N(x^*)\le \epsilon$. Vì $x_k\to x^*$ và $g_N$ liên tục nên tồn tại $p\ge N$ sao cho $|g_N(x_p) - g_N(x^*)| \le \epsilon$. Thế thì $g_N(x_p) \le g_N(x^*)+\epsilon \le 2\epsilon$. Do $g_N\ge g_p$ nên $g_N(x_p) \ge g_p(x_p) = M_p \ge L$. Vậy $L \le 2\epsilon$. Điều này đúng với mọi $\epsilon > 0$ nên $L=0$.
Hi vọng không có chỗ nào sai. Ở trên tính compact của $X$ được sử dụng thêm ở chỗ lấy $\sup$ (ngoài chỗ lấy dãy con hội tụ), nhưng thực ra không cần thiết. Ở bước này không cần $\sup$ phải đạt được mà chỉ cần lấy $x_n$ sao cho $g_n(x_n) \ge M_n - \epsilon$.