2013-02-21 13 views
52

Tại sao JavaScript hoist biến?Tại sao JavaScript hoist biến?

Lý do cơ bản của nhà thiết kế khi họ quyết định triển khai cẩu là gì? Có bất kỳ ngôn ngữ phổ biến nào khác thực hiện việc này không?

Vui lòng cung cấp liên kết có liên quan đến tài liệu và/hoặc hồ sơ.

+1

[“vì javascript không thực sự có ý nghĩa thực sự về phạm vi từ vựng”] (http://stackoverflow.com/a/3725763/344643), điều đó có nghĩa là –

+0

Tốt! bạn có biết tại sao ? – Xlaudius

+4

Tôi nghi ngờ tại * này * điểm đó là lịch sử, và tôi nghiêm túc nghi ngờ nó là bất cứ điều gì khác hơn là "dễ thực hiện" ban đầu. –

Trả lời

34

Như Stoyan Stefanov giải thích trong cuốn sách "Mẫu JavaScript", cẩu là kết quả của việc thực hiện thông dịch JavaScript.

Giải thích mã JS được thực hiện theo hai lần. Trong lần truyền đầu tiên, trình thông dịch xử lý các khai báo biến và hàm.

Bước thứ hai thực sự là bước thực thi mã. Trình thông dịch xử lý các biểu thức hàm và các biến không khai báo.

Do đó, chúng tôi có thể sử dụng khái niệm "cẩu" để mô tả hành vi như vậy.

Hy vọng điều này sẽ hữu ích.

+8

Cá nhân tôi _really_ không thích từ "cẩu".Nó cho phép biểu diễn sai rằng các khai báo biến và hàm được hoành tráng đến đỉnh của phạm vi hiện tại, khi thực tế, trình thông dịch JS, như bạn đã đề cập, quét mã nguồn cho các ràng buộc và ** sau đó thực thi mã. – contactmatt

+0

Bây giờ tôi đã hiểu tại sao ngôn ngữ JS bị hiểu lầm nhất, tôi không thấy điều này trong bất kỳ hướng dẫn nào. Và đã nhầm lẫn với cẩu (và dòng chảy interepreter). –

+2

Uh, điều này không thực sự giải thích lý do. Một thông dịch viên một lần (mà không dẫn đến cẩu) sẽ đơn giản hơn nhiều - vậy tại sao các nhà thiết kế lựa chọn hai vé? – Bergi