Theo như tôi hiểu, đó là những tên chỉ khác nhau được dùng để chỉ cùng một loại thực thể (từ vựng Môi trường). Họ có tên khác nhau do các mục đích khác nhau.
LexicalEnvironment
được sử dụng để phân định số nhận dạng trong khi VariableEnvironment
được sử dụng để khai báo các biến và hàm.
Cả hai đều tham chiếu Môi trường Lexical (= Ghi môi trường + Môi trường Lexical ngoài tùy chọn; còn gọi là chuỗi phạm vi) được tạo cho mỗi ngữ cảnh thực thi.
Các thành phần môi trường và môi trường biến thể của một môi trường thực thi luôn là Môi trường thực tế. Khi một bối cảnh thực hiện được tạo ra, các thành phần LexicalEnvironment và VariableEnvironment ban đầu có cùng giá trị. Giá trị của các thành phần VariableEnvironment bao giờ thay đổi trong khi giá trị của các thành phần LexicalEnvironment có thể thay đổi trong quá trình thực thi mã trong một bối cảnh thực hiện
Ví dụ trong mã giả:
// VariableEnvironment (global) = { __outer__: null }
// LexicalEnvironment = VariableEnvironment (global)
(function foo() {
// VariableEnvironment (A) = { x: undefined, __outer__: global }
// LexicalEnvironment = VariableEnvironment (A)
var x;
(function bar(){
// VariableEnvironment (B) = { y: undefined, __outer__: A }
// LexicalEnvironment = VariableEnvironment (B)
var y;
x = 2;
// VariableEnvironment (A) = { x: 2, __outer__: global }
// LexicalEnvironment is still the same as VariableEnvironment (B)
})();
})();
Bạn và Bergi dường như có cách diễn giải khác nhau về "giá trị của thành phần LexicalEnvironment có thể thay đổi". Vui lòng sửa tôi nếu bạn sai, nhưng dường như bạn đang nói về những thay đổi về giá trị của một thành phần của Môi trường Lexical (ví dụ, với phép gán biến), trong khi câu trả lời của Bergi là về trường hợp toàn bộ đối tượng LexicalEnvironment được thay thế. Bây giờ tôi đang bối rối! – bfavaretto
Tôi có nghĩa là "nếu * tôi * sai"! :) – bfavaretto
Tôi không nghĩ rằng chúng tôi có cách diễn giải khác nhau. Nhưng nhìn vào ví dụ của tôi, tôi có thể thấy nó có thể gây nhầm lẫn như thế nào. Xin lỗi :) Chuyển nhượng biến chắc chắn không thay đổi bất cứ điều gì về LexicalEnvironment. Tôi chỉ muốn cho thấy rằng VE thay đổi từ ngữ cảnh chức năng này sang ngữ cảnh khác, trong khi LE - phần lớn thời gian - chỉ là một tham chiếu đến VE hiện tại. Những gì @Bergi đã đề cập về 'catch' và' with' là chính xác. Đó là hai trường hợp khi LE và VE tham chiếu các môi trường khác nhau (không cần VE mới trong 'with' và' catch'; chỉ LE mới - để có thể giải quyết các mã định danh bổ sung) – kangax