28538


**下記で、1.jsの内容を、常に2.jsで使用できるでしょうか？**

[code]

    <script src="1.js" defer></script>
    <script src="2.js" defer></script>
    
[/code]

* * *

**下記の場合の実行順序は？**  
・1.js処理後に、2.jsを処理？

[code]

    <script src="1.js" defer></script>
    <script src="2.js"></script>
    
[/code]


CC BY-SA 3.0
2016-08-28T03:54:03.213
28536
2016-08-28T05:13:35.337
7886
question
javascript
<script defer>を複数記述した場合、実行順序は保証されるでしょうか？


[仕様](https://www.w3.org/TR/html5/scripting-1.html#script-processing-src-
prepare)上の話だけだと

[code]

    <script src="1.js" defer></script>
    <script src="2.js" defer></script>
    
[/code]

の場合は2.jsが実行される段階で1.jsの処理は終わっていて

[code]

    <script src="1.js" defer></script>
    <script src="2.js"></script>
    
[/code]

の場合1.jsが実行される段階で2.jsの処理は終わっていることが保証されます（`defer`の付いていない2.jsはhtmlのパースを中断して実行されるので`defer`されたものより先になります）。

ただ現実問題として、最低でもFirefoxには仕様通りに動かない[バグ（タイトルだとFirebugアドオンを入れているととありますが、アドオンなしでも起きることが確認されています）](https://bugzilla.mozilla.org/show_bug.cgi?id=1212696)が確認されていますし、`defer`をサポートしない古いブラウザとかもあると思うので、現段階で`defer`の仕様に頼った実装をするのは危険だと思います。

* * *

余談ですが、`async`属性をつけた場合そのスクリプトがいつ実行されるかは全く予想がつきませんが、ロードが終わり次第最速のタイミングで実行されます（htmlのパースが終わっていない場合そちらを一時中断）。また`defer`と`async`は同時に使え、ともに外部スクリプト専用です。


CC BY-SA 3.0
2016-08-28T04:51:51.743
28538
2016-08-28T05:13:35.337
2016-08-28T05:13:35.337
3974
3974
28536
answer