Hỏi về cấu trúc IIFE và kết quả thực thi
Kết quả của đoạn mã JavaScript trên là 83 do cách nó xử lý tham số truyền vào hàm.
Khi bạn truyền 0123 vào hàm, JavaScript coi nó là một số nguyên trong hệ bát phân (octal) vì nó bắt đầu bằng số 0. Trong hệ bát phân, số 123 tương ứng với:
1 x 8^2 + 2 x 8^1 + 3 x 8^0 = 64 + 16 + 3 = 83
Vì vậy, khi console.log(exports); được thực thi, giá trị của exports là 83.
Variable ENV, Lexical ENV, Closures và Execution context
😉 Trước khi trả lời, ta cần hiểu rõ mọi thuật ngữ, mình giải thích đơn giản như sau:
-
Lexical Environment : Ngữ cảnh khi 1 hàm được tạo ra, bao gồm 2 thông tin
- Environment Record : lưu trữ các biến và hàm được khai báo trong ngữ cảnh
- Outer Lexical Environment Reference : tham chiếu tới 1 ngữ cảnh Lexical khác ở bên ngoài
-
Variable Environment : Là 1 phần của Lexical Enviroment, nơi lưu trữ các biến được khai báo. (Gần giống Environment Record)
-
Execution Context : bao gồm mọi thứ cần thiết để thực thi mã JavaScript tại một thời điểm nhất định. Một Context bao gồm.
- Variable Environment : Lưu các biến tạo ra trong hàm hoặc khối lệnh khi thực thi
- Lexical Environment : Như đã nói ở trên
😀 Nếu bạn đã hiểu các định nghĩa trên, ta hãy tham khảo ví dụ sau :
const funcHandle = () => {
// "funcHandle Lexical Environment" được tạo ra
// - Environment Record là a và temp
// - Outer Lexical Environment Reference : Global Lexical Environment
let a = 0;
const temp = () => {
// "temp Lexical Environment" được tạo ra
// - Environment Record là c
// - Outer Lexical Environment Reference : funcHandle Lexical Environment
let c = 0;
// +1 cho 2 biến và in ra
console.log(++a, ++c);
};
return temp;
};
const run = funcHandle();
run(); // kết quả 1,1
run(); // kết quả 2,1
run(); // kết quả 3,1
Qua ví dụ trên, ta hiểu khi hàm temp được tạo, nó sẽ liên kết với Lexical Enviroment của hàm funcHandle.
Nên khi temp được đại diện bởi run, theo nguyên tắc Garbage Collector sẽ không thể pop Lexical Enviroment của temp (trong đó có biến a) bởi vì nó vẫn còn được tham chiếu tại biến run.
Và khi run được chạy, đồng nghĩa việc chạy temp, Execution Context sẽ được tạo mới, đồng nghĩa Environment Variable cũng phải được làm mới (tạo mới c), chỉ có mỗi funcHandle Lexical Environment vẫn còn được giữ nguyên và tái sử dụng, và đây chính là nguyên tắc hoạt động của Closures khi có thể tái sử dụng lại Lexical Enviroment tại nơi mà nó được tạo ra. 👍️
🚀 Kết luận: Câu trả lời cho câu hỏi của bạn là: Closures làm việc dựa trên Lexical Environment chứ không phải Variable Environment. Bởi Lexical Environment là tiêu điểm khi có thể tái sử dụng được, trong khi Environment Variable luôn được tạo mới mỗi khi Execution Context được tạo và khởi chạy.
👌Happy coding !!!
Nên Liên thông đại học không
Theo xu thế hiện tại thì không cần thiết lắm, suy cho cũng ai nắm bắt công nghệ tốt hơn thì giỏi hơn thì sẽ đáp ứng công việc tốt hơn. Cũng một phần doanh nghiệp hiện tại cũng đã dần có nhận thức tốt hơn trong lĩnh vực IT rồi, nên họ cũng hiểu được mặt nào quan trọng hơn. Tuy nhiên sẽ có một số rủi ro đường dài có thể gặp, đó chính là leo lên một chức vị cao hơn trong công ty, do có một số bộ phận không lành mạnh trong công ty sẽ đào lại quá khứ để tìm cách hạ bệ mình trong cuộc đua tranh cử vị trí mới thôi. Nên có thể cân nhắc loại hình vừa học vừa làm, học ở đâu cũng được, miễn không ảnh hưởng quá nhiều tới thời gian của mình là được.
Lưu Cart đâu cho hợp lí
😉 Nên sử dụng Redis để lưu, vì ưu điểm nó truy xuất nhanh và có thể mở rộng dễ dàng 👍️. Tuy nhiên cần quản lý khi nào thì dữ hết hạn để backup dữ liệu xuống Database và làm mới lại vùng nhớ trên Redis.
🚀 Happy coding !!!
Các kĩ năng
Tổ chức
Chưa có tổ chức nào.