Menu
CoddyTech

Closure là gì?

Thuộc phần Logic và luồng chương trình trong hành trình Lua của Coddy. Bài học 14 trên 54.

Bạn đã học rằng hàm (function) có thể được lưu trong biến, truyền làm đối số và được trả về từ các hàm khác. Bây giờ, mình sẽ cùng bạn tìm hiểu một trong những hệ quả mạnh mẽ nhất của điều này: closure.

Closure xảy ra khi một hàm lồng bên trong “ghi nhớ” các biến cục bộ từ hàm bao quanh nó, ngay cả sau khi hàm bên ngoài đó chạy xong. Ban đầu, điều này có thể nghe lạ: làm sao một biến vẫn tồn tại sau khi hàm tạo ra nó đã chạy xong?

Đây là một ví dụ đơn giản minh họa khái niệm này:

function createCounter()
    local count = 0
    
    return function()
        count = count + 1
        return count
    end
end

local counter = createCounter()
print(counter())  -- Đầu ra: 1
print(counter())  -- Đầu ra: 2
print(counter())  -- Đầu ra: 3

Khi gọi createCounter(), hàm này tạo một biến cục bộ count rồi trả về một hàm ẩn danh. Thông thường, bạn sẽ nghĩ rằng count biến mất khi createCounter() chạy xong. Nhưng hàm được trả về vẫn truy cập được count. Hàm đó “bao đóng” biến này.

Mỗi lần bạn gọi counter(), hàm này truy cập và sửa đổi cùng một biến count đã được tạo khi createCounter() chạy lần đầu. Hàm bên trong mang theo môi trường của nó, giúp duy trì trạng thái giữa các lần gọi.

challenge icon

Thử thách

Dễ

Viết một hàm createMultiplier để tạo một hàm nhân với một hệ số cụ thể, rồi dùng ngay hàm đó để nhân một số đã cho.

Logic:

  • Tạo một hàm lồng bên trong createMultiplier, hàm này nhận một tham số số
  • Hàm lồng sẽ nhân tham số của nó với factor từ hàm bên ngoài
  • Hàm lồng sẽ tạo thành một closure, ghi nhớ giá trị factor
  • Gọi hàm nhân với tham số number và trả về kết quả

Tham số:

  • factor (số): Giá trị dùng để nhân
  • number (số): Số cần nhân

Giá trị trả về:

  • Kết quả nhân number với factor (số)

Tự làm thử

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- Dùng hàm (function) multiply bên dưới

end
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch Lua online