2010-07-12 28 views
26

Có đúng là không có sự đảm bảo nào trên các trình duyệt chính rằng các thẻ script sau sẽ luôn thực hiện cả tuần tự AND và theo thứ tự khai báo? tức là tôi có nên giả định rằng mã sau sẽ không luôn mang lại x == 'ab' trong cảnh báo?Thứ tự JavaScript <script> thực thi thẻ không được đảm bảo trong các trình duyệt chính?

<head> 
    <script type="text/javascript"> 
     //tag A 
     var x = x || ''; x += 'a'; 
    </script> 
    <script type="text/javascript"> 
     //tag B 
     var x = x || ''; x += 'b'; 
    </script> 
</head> 
<body> 
    <script type="text/javascript"> 
     alert('x='+x); 
    <script> 
</body> 

... và nó có thể là x sẽ thay là một trong những cách sau:

  1. 'ba' - nếu thẻ B thực hiện trước khi A
  2. 'a' hoặc 'b' - tình trạng chủng tộc trong đó A và B thực hiện song song (Mặc dù có vẻ như this chủ đề nói rõ ràng rằng các trình duyệt chỉ phân bổ một chủ đề duy nhất của JS)
+2

Tôi quen thuộc với vấn đề này đối với tệp js src được liên kết, không phải cho khối tập lệnh như được xác định trong câu hỏi. ví dụ. sẽ thất bại 9 lần trong số mười (tệp js được lưu trong bộ nhớ cache là 1 trong 10) –

+2

Trình duyệt chắc chắn nhất nên thực thi các tập lệnh này cả tuần tự và trong gọi món. Kinh nghiệm của bạn có ngược lại không? –

+4

@JonathanFingland: Nó không phải là một vấn đề đối với các tệp JS được liên kết, trừ khi chúng sử dụng các thuộc tính 'async' hoặc 'defer', hoặc tự viết/thêm các tập lệnh nữa. – bobince

Trả lời

30

Trình tự thực hiện những phi động thêm 0.123.thẻ nên hoàn toàn sequentially ở mọi trình duyệt:

Snippet từ this link:

báo cáo JavaScript xuất hiện giữa <script></script> thẻ được thực hiện theo thứ tự xuất hiện; khi nhiều tập lệnh xuất hiện trong tệp , các tập lệnh được thực thi theo thứ tự mà chúng xuất hiện.

Tuy nhiên, mọi thứ có thể thay đổi càng sớm càng bạn:

+3

Điều này thậm chí còn đúng đối với các kịch bản lệnh 'document.write' lồng nhau, xem [document.write order execution order] (http://kangax.github.com/jstests/document_write_script_execution_order_test/) bởi kangax. –

+0

Hôm nay tôi không gặp khó khăn như vậy. Trang web của tôi là tốt, cho đến khi tôi đặt tĩnh trên một CDN và thứ tự tải không được đảm bảo nữa (bằng cách nào đó máy chủ tĩnh ban đầu của tôi phục vụ trên FIFO (đầu tiên trong lần đầu tiên ra)).Mẹo: không tải nhiều tệp js phụ thuộc bằng cách thêm thẻ tập lệnh động. Sau đó, chỉ cần concat các tập tin hoặc như vậy. Cảm ơn các bạn! – gabn88

+0

Đặc biệt, nhiều '

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