Tôi đang cố hiểu các quy tắc phạm vi JavaScript. Những gì tôi đã đọc trong sách giáo khoa và tài liệu là khó hiểu. Có vẻ như với tôi rằng JavaScript là một ngôn ngữ phạm vi tĩnh (hoặc lexically) - khi cố gắng liên kết một tên biến với một biến (định nghĩa), cấu trúc từ vựng của mã được sử dụng.Phạm vi JavaScript và ngữ cảnh thực hiện
Ngữ cảnh thực thi có vẻ tương tự như khung ngăn xếp trên ngăn xếp cuộc gọi. Mỗi bối cảnh thực hiện có một đối tượng biến mà tất cả các biến cục bộ (của hàm liên kết) được định nghĩa. Các đối tượng biến được liên kết với nhau để cung cấp một 'chuỗi phạm vi' từ đối tượng biến ở trên cùng của ngăn xếp đến đối tượng biến ở dưới cùng của ngăn xếp (đối tượng cửa sổ). Chuỗi phạm vi này được tìm kiếm từ trên xuống dưới trong các tên biến liên kết với các biến. Điều này rất giống với các ngôn ngữ có phạm vi tĩnh như C/C++/Java.
Có một sự khác biệt quan trọng đối với C/C++/Java - có thể truy cập một biến được xác định trong một hàm có khung ngăn xếp không còn trên ngăn xếp cuộc gọi, như trong ví dụ bên dưới:
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
Tôi có được quyền này không? Có vấn đề nào khác mà tôi nên biết không?
Cảm ơn trước
Một bài đăng rất kỹ lưỡng nhấn HN ngày hôm nay chạm vào điều này: [Ngữ cảnh thực thi & ngăn xếp trong JavaScript là gì?] (Http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
Điều này được gọi là * đóng *. Hàm bạn gán cho 'printColor' có quyền truy cập vào tất cả các biến được định nghĩa trong' changeColor' ngay cả sau khi hàm kết thúc. Tôi không biết làm thế nào đây là trong C. –
@FelixKling gần như. tuy nhiên changeColor được định nghĩa trên phạm vi toàn cục, do đó phạm vi của nó sẽ không bao giờ được thu gom rác. – webduvet