2011-02-01 38 views
10

Nói rằng tôi có đoạn mã sau:javascript thực hiện đơn đặt hàng với setTimeout()

function testA { 
    setTimeout('testB()', 1000); 
    doLong(); 
} 

function testB { 
    doSomething(); 
} 

function doLong() { 
    //takes a few seconds to do something 
} 

tôi thực testA(). Tôi đã đọc Javascript là đơn luồng. Điều gì xảy ra sau 1000 mili giây, khi hết thời gian chờ cho testB()?

Một số khả năng tôi có thể nghĩ:

  • testB() đang xếp hàng để thực hiện sau khi doLong() và bất cứ thứ gì nó được gọi là đã hoàn thành.
  • doLong() bị chấm dứt ngay lập tức và testB() được bắt đầu.
  • doLong() được thực hiện lâu hơn một chút để thực thi trước khi bị dừng (tự động hoặc sau khi nhắc người dùng) và testB() được bắt đầu.
  • doLong() bị tạm dừng, testB() được bắt đầu. Sau khi testB() đã hoàn tất, doLong() hồ sơ.

Câu trả lời đúng là gì? Có phải phụ thuộc thực hiện hay một phần của tiêu chuẩn? *

This question tương tự nhưng không giống nhau, theo như tôi có thể biết.

Bất kỳ liên kết nào bạn có thể đề xuất để hiểu rõ hơn về việc thực thi Javascript sẽ được đánh giá cao.

Cảm ơn!

* Vâng, tôi biết rằng không phải tất cả các trình duyệt theo tiêu chuẩn :(

Trả lời

10

đầu tiên trong dự đoán của bạn là đúng nhất: testB() is queued up to execute after doLong() and anything else it called have finished.

Nếu phải mất hơn một giây cho testA để kết thúc, testB đơn giản là phải chờ đợi.

Ngoài ra, bạn nên viết setTimeout(testB, 1000) thay vì setTimeout('testB()', 1000). Gửi chuỗi đến setTimeout là, như sử dụng eval, generally considered evil và sẽ làm cho bạn kẻ thù;)

+0

Tôi đã tin rằng 'setTimeout (function() {testB(); }, 1000); 'là cách tốt nhất, tôi có bị lừa dối không? –

+2

@Shadow Wizard: Có, khá nhiều bị nhầm lẫn. Theo như tôi biết không có sự khác biệt giữa con đường của bạn và của tôi (ngoại trừ rằng tôi là ngắn hơn tất nhiên: D). Để minh họa, hãy tưởng tượng nếu chúng ta kéo biểu thức của bạn thành một biến: 'var f = function() {testB(); }; setTimeout (f, 1000); '. Vẫn còn ý nghĩa tương tự, nhưng bây giờ bạn có thể thấy sự thừa. – Jakob

+1

Cảm ơn bạn, cả câu trả lời và lời khuyên về việc chuyển một hàm đến setTimeout thay vì một String. Có vẻ như các hướng dẫn tôi đã đọc không đáng ngờ;) –

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