Học Javascript 6: Scope Chain là gì?
Tìm hiểu về Scope Chain trong JavaScript, cách hoạt động của Outer Environment và cách biến được tìm kiếm trong các Execution Context

Giới thiệu
Ở bài trước Execution Stack là gì?, mình có để đoạn code sau:
var text = 'outside';
function show(){
console.log(text);
var text = 'inside';
};
show();
Có một bạn vào trả lời như sau:
Hiểu theo cách này cũng được. Nhưng trong 5 bài học trước từ Lexical Environment, Global Environment, hoisting và Execution Stack, mình muốn các bạn hiểu rõ tại sao kết quả code chạy như vậy, chứ không phải hiểu theo cảm tính ( vì trước đây mình cũng từng nghĩ như vậy ). Hay giải thích kiểu vu vơ như tại Scope nó như vậy.
Và hôm nay, chúng ta sẽ tập trung vào đoan code này
function b() {
console.log(text);
}
function a() {
var text = "in a";
b();
}
a();
var text = "in global";
Theo bạn, kết quả in ra là gì, giải thích tại sao?
Nếu bạn có theo dõi các bài trước, thì có thể vẽ được Execution Stack như thế này:
Có thể bạn đang nghĩ vì không có biến text trong hàm b() nên có thể chương trình báo lỗi.
Outer Environment
Ở bài Global Environment và Global Object, mình có nhắc qua về Outer Environment, vậy nó là gì? Outer Environment của một Execution Context sẽ trỏ tới một Execution Context khác 'bao' bên ngoài gần nó nhất ( hay ám chỉ Lexical Environment của Execution Context đó )
Khó hiểu lúng đúng không? Mình cũng thấy vậy, thiệt ra định nghĩa dài dòng vậy thôi chứ nó đơn giản lắm.
Giống ví dụ trên Outer Environment của hàm cả hàm a() và b() đều là global
Scope Chain là gì?
Quay lại đoạn code trên, kết quả sẽ là undefined.
Vì trong một Execution Context , nếu ta truy cập giá trị một biến, mà không tìm thấy biến đó trong Execution Context hiện tại thì nó sẽ tìm ở Outer Environment.
Trong b() , text không có nên nó tìm biến text ở Outer Environment là ở Global, mà do hoisting nên text mới khởi tạo chứ chưa gán giá trị nên kết quả là undefined.
Ta chỉnh code lại một tý, thì kết quả là 'in a' do Outer Environment của b() đã khác:
Test yourself
Bạn vào link dưới đây
http://madebyknight.com/javascript-scope/
Trừ câu cuối là closure ra, nếu bạn làm đúng hết và giải thích rõ tại sao thì phần scope xem như đã khá vững.
Kết luận
Thực ra bạn hiểu thì dễ nhưng để giải thích cho người khác thì phải dùng từ ngữ làm sao để họ phân biệt được. Và mục đích 6 bài đầu là để giải thích những vấn đề về Scope trong Javascript. Đó là lý do mình chọn những từ 'jargon' như: Lexical Environment, Global Environment, Execution Context, Execution Stack,vv Vì đó là những từ 'đúng chuẩn', với lại cũng không thể Việt hóa chúng được
Related Posts
Discover more content you might enjoy

Học Javascript 5: Execution Stack là gì?
Tìm hiểu về Execution Stack trong JavaScript, cách hoạt động của Execution Context và Variable Environment
![Học Javascript 7: [ES6] Phân biệt var, let và const](/_next/image?url=https%3A%2F%2Fres.cloudinary.com%2Fkhoanguyen1505%2Fimage%2Fupload%2Fv1751211000%2Fkhoa_blog%2Fjavascript_es6_var_let_const.jpg&w=828&q=75)
Học Javascript 7: [ES6] Phân biệt var, let và const
Tìm hiểu về sự khác biệt giữa var, let và const trong JavaScript ES6, cách hoạt động của block scope và các quy tắc sử dụng

English Course Challenge in 2 weeks - Day 12: Kinh nghiệm quay khoá học
Bài viết chia sẻ kinh nghiệm quay khóa học tiếng Anh về Bubble.io, bao gồm việc lựa chọn phần mềm Screen.Studio để quay màn hình và tự động tạo phụ đề, những bài học từ việc đặt mục tiêu và xác định đối tượng học viên trước khi chọn nội dung, cũng như lợi ích của việc thử thách bản thân để vượt qua nỗi sợ và hoàn thành dự định. Tác giả cũng giới thiệu khóa học 'Build your first web app in Bubble for beginners' dành cho người mới bắt đầu.

English Course Challenge in 2 weeks - Day 7: Fine-tuning ChatGPT là gì?
Bài viết chia sẻ tiến trình ngày thứ 7 trong thử thách tạo khóa học tiếng Anh trong 2 tuần. Tác giả giới thiệu về Fine-tuning ChatGPT, một tính năng cho phép tạo phiên bản ChatGPT tùy chỉnh dựa trên dữ liệu cung cấp, đặc biệt hữu ích cho chatbot hỗ trợ khách hàng. Bài viết cũng thảo luận về việc điều chỉnh hướng phát triển ứng dụng demo và khóa học, cùng với những khó khăn khi sử dụng API của OpenAI tại Việt Nam.

Quản lý bộ nhớ trong Swift
Tìm hiểu về cách quản lý bộ nhớ trong Swift, sự khác biệt giữa Stack và Heap, Value Types và Reference Types
