2011-06-25 48 views
10

Tôi tự hỏi làm thế nào vòng lặp sự kiện hoạt động trong javascript, Tôi đang sử dụng node.js nhưng tôi đoán rằng cùng một câu hỏi áp dụng cho các trình duyệt.javascript event-loop question

Tôi có một số cuộc gọi async (giả sử setTimeout hoặc $.ajax hoặc fs.readFile) và sau một thời gian sự kiện vòng lặp thực thi callback

bây giờ khi các callback đang nhận được thực hiện, những gì xảy ra đằng sau những cảnh? Liệu nó có làm sống lại ngăn xếp mà nó sử dụng khi nó gọi các công cụ không đồng bộ không?

Thực tế ngữ cảnh/điều này gọi lại là gì? và cách hoạt động?

chỉnh sửa: cảm ơn, tôi thấy .. chỉ là một vấn đề nữa, vòng lặp sự kiện "ghi nhớ" phạm vi của cuộc gọi lại như thế nào?

+1

Không. JavaScript không hồi sinh ngăn xếp. Đọc về cách đóng cửa hoạt động. – Nican

+1

Điều này có thể được sử dụng: (http://stackoverflow.com/questions/183214/javascript-callback-scope). Và đối với một hàm jQuery có liên quan: (http://api.jquery.com/jQuery.proxy/) –

Trả lời

2

Sử dụng JavaScript phạm vi chức năng, các quy tắc phạm vi đều giống nhau trong tất cả các môi trường JS. Như Nican đã đề cập đến sự hiểu biết về đóng cửa là điều quan trọng để biết những gì có sẵn trong phạm vi hiện tại của bạn.

Về cơ bản, một chức năng "ghi nhớ" môi trường mà nó được xác định. Vì vậy, nếu bạn sử dụng một hàm ẩn danh nội tuyến cho hàm gọi lại của bạn, nó sẽ có quyền truy cập vào tất cả các biến có sẵn cho hàm cha của nó và bất cứ thứ gì được chuyển vào nó như một đối số.

Một vài nguồn lực về việc đóng cửa và phạm vi trong JavaScript:

Stoyan Stefanov của cuốn sách Object-Oriented Javascript thực hiện một công việc tuyệt vời trong việc giải thích phạm vi trong JavaScript và cách hoạt động của các hàm lexical scoping (xem chương 4). Tôi muốn giới thiệu cuốn sách này cho bất kỳ ai nghiêm túc về lập trình JS.

+0

vòng lặp sự kiện "nhớ" phạm vi của một cuộc gọi lại như thế nào? –

+1

@browsingLoops: Cuộc gọi lại nhớ phạm vi của chính nó. Khi hàm * định nghĩa *, hàm thừa hưởng chuỗi phạm vi của hàm ngoài (nếu có). Hãy xem [đặc tả] (http://ecma262-5.com/ELS5_HTML.htm#Section_13). Đối với khai báo hàm nó nói: * "Trả về kết quả của việc tạo một đối tượng hàm mới như được chỉ rõ trong 13.2 với các tham số được chỉ định bởi' FormalParameterListopt' và phần tử được chỉ định bởi 'FunctionBody'. ** Truyền vào' VariableEnvironment' của ngữ cảnh thực thi đang chạy như 'Phạm vi'." *** –

0

Có một công cụ đẹp được gọi là Javascript Loupe được tạo bởi Philip Roberts sẽ giúp bạn hiểu cách gọi/sự kiện và lặp/gọi lại của javascript với nhau. Viết một số mã javascript trong trình chỉnh sửa và cố gắng chạy nó.

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