2013-02-22 33 views

Trả lời

7

Cả hai đều là các thành phần (cùng loại) của các bối cảnh thực thi, nhưng chúng phục vụ các mục đích riêng biệt (from the spec):

LexicalEnvironment

Xác định Lexical Environment được sử dụng để giải quyết các tham chiếu nhận dạng được thực hiện bởi mã trong ngữ cảnh thực thi này.

VariableEnvironment

Xác định Lexical Environment có môi trường kỷ lục giữ cam kết ràng buộc tạo ra bởi VariableStatements và FunctionDeclarations trong bối cảnh thực thi này.

Đoạn tiếp theo giải thích lý do tại sao họ cần phải khác nhau:

Khi một bối cảnh thực hiện được tạo ra LexicalEnvironment và VariableEnvironment của nó thành phần ban đầu có cùng một giá trị. Giá trị của thành phần VariableEnvironment không bao giờ thay đổi trong khi giá trị của thành phần LexicalEnvironment có thể thay đổi trong khi thực thi mã trong ngữ cảnh thực thi.

Điều đó không xảy ra thường xuyên và thường cả hai tham chiếu đến cùng một Lexical Environment. Một ví dụ điển hình cho một môi trường LexicalEnvironment đang thay đổi được đưa ra trong câu hỏi Why do catch clauses have their own lexical environment? - xem §12.14. Một nơi khác mà tôi có thể tìm thấy trong thông số nơi điều này xảy ra là With Statements (§12.10) trong đó Object Environment Record được sử dụng động cho độ phân giải số nhận dạng - nhưng các khai báo biến/chức năng là tĩnh.

4

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) 

    })(); 

})(); 
+0

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

+0

Tôi có nghĩa là "nếu * tôi * sai"! :) – bfavaretto

+0

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

Các vấn đề liên quan