Hàm đóng của ECMAScript
- Trang trước Đối tượng Function
- Trang tiếp theo Hướng đối tượng
Điểm dễ hiểu lầm nhất của ECMAScript là nó hỗ trợ hàm đóng (closure).
Closure, là chỉ từ ngữ pháp bao gồm biến không được tính toán trong hàm, tức là hàm có thể sử dụng biến được định nghĩa bên ngoài hàm.
Mô hình closure đơn giản
Sử dụng biến toàn cục trong ECMAScript là một mô hình closure đơn giản. Hãy suy nghĩ về đoạn mã sau:
var sMessage = "hello world"; function sayHelloWorld() { alert(sMessage); } sayHelloWorld();
Trong đoạn mã này, khi脚本 được tải vào bộ nhớ, không tính giá trị của biến sMessage cho hàm sayHelloWorld(). Hàm này chỉ bắt giữ giá trị của sMessage để sử dụng sau này, có nghĩa là trình giải thích biết rằng khi gọi hàm sayHelloWorld() cần kiểm tra giá trị của sMessage. sMessage sẽ được gán giá trị trong hàm gọi sayHelloWorld() (dòng cuối cùng), hiển thị thông điệp "hello world".
Mô hình closure phức tạp
Định nghĩa một hàm trong hàm khác sẽ làm closure trở nên phức tạp hơn. Ví dụ:
var iBaseNum = 10; function addNum(iNum1, iNum2) { function doAdd() { return iNum1 + iNum2 + iBaseNum; } return doAdd(); }
Ở đây, hàm addNum() bao gồm hàm doAdd() (closure). Hàm nội bộ là một closure vì nó sẽ lấy giá trị của tham số iNum1 và iNum2 của hàm bên ngoài và giá trị của biến toàn cục iBaseNum. Bước cuối cùng của hàm addNum() là gọi doAdd(), cộng hai tham số và biến toàn cục, và trả về tổng của chúng.
Giải pháp quan trọng cần nhớ là hàm doAdd() không chấp nhận tham số, giá trị mà nó sử dụng được lấy từ môi trường thực thi.
Có thể thấy, closure là một phần rất mạnh và đa năng trong ECMAScript, có thể được sử dụng để thực hiện các tính toán phức tạp.
Lưu ý:Như sử dụng bất kỳ hàm cao cấp nào, cần cẩn thận khi sử dụng closure vì chúng có thể trở nên rất phức tạp.
- Trang trước Đối tượng Function
- Trang tiếp theo Hướng đối tượng