通常、script
タグは、HTMLの解析、スクリプトのフェッチ、実行、およびHTMLの解析を続行するようブラウザに指示します。これは、スクリプトコードがdocument.write
を使用してHTMLトークンストリームに出力できるためです。
async
and defer
は、ブラウザに、スクリプトファイルのダウンロードと並行してHTMLの解析を続け、後でスクリプトファイルをすぐに実行するように指示するメカニズムです。
少し違いますが、 HTMLの仕様のWHAT-WGのバージョンのthe script
sectionから、この図は、違いを想定するのに便利です:
![enter image description here](https://i.stack.imgur.com/7LIpf.png)
上記のリンク仕様ではなく、簡潔で、「古典」のスクリプト(一種のための完全な詳細をあなたが使用している、しかし、モジュールのスクリプトがすぐに来ている):!
async
とdefer
どちらも、HTMLの構文解析をダウンロードするためのスクリプトを待たずに継続することができます。
defer
は、解析が完了するまでスクリプトの実行を待機します。
async
は、スクリプトのダウンロードが完了するまでブラウザーを待機させるだけです。つまり、ダウンロードが完了した時点(またはキャッシュからのものである可能性があることに注意してください)に応じて、解析が完了するか後で実行されます。
async
が存在し、ブラウザでサポートされている場合は、defer
よりも優先されます。
async
スクリプトは、HTMLに表示される順序に関係なく、任意の順序で実行できます。
defer
スクリプトは、解析が完了すると、HTMLに表示される順序で実行されます。
async
とdefer
は半近代のブラウザでも十分にサポートされていますが、IE9以前では適切にサポートされていません。hereとhereを参照してください。
なぜdefer
フラグは、DOM操作を実行するスクリプトのために提案されるのでしょうか?
- それはスクリプトがダウンロードされている間、解析を継続することを可能にし、
- これは、解析が完了するまで実行されていないスクリプトを意味します
つの理由。
あなたがdefer
を使用していないとあなたはdefer
は、APIスクリプトがスクリプトはそれを操作しようとする前に、DOMを構築し、ブラウザの仕上げをさせることにより、適切に振る舞うことができます使用して、非最適にごscript
タグを配置した場合。
多くの人々はまだそれは通常、あなたがdefer
(またはasync
)を使用ない限り、彼らにを置くために最悪の場所だにも関わらず、文書のhead
セクションにscript
タグを置きます。ほとんどの場合、他の何かをする理由がない限り、最良の場所はエンドの</body>
タグの直前です。A)あなたのサイトはスクリプトを待たずにすばやくレンダリングされます。 B)DOMは操作する前に完全に構築されています。 defer
を推奨すると、script
タグをHTMLに挿入するのが早すぎる人からのサポートの手間を省ける可能性があります。
私は私が見ていると思います。だから、私は遅延属性と非同期属性を理解するために読む[記事](http://www.sitepoint.com/non-blocking-async-defer/)は**まったく間違っています**、**仕様**と矛盾します。それはGoogle上で(https://google.com/?q=javascript+defer+async)非常に高い評価を受けています。 – dotancohen
@dotancohen:いいえ、正解です。「...にはdocument.writeやDOMの変更の不自然さは含まれていません:」と少し曖昧です。 * *は、 "...パーサーでインラインで実行するためのdocument.writeやDOMの変更は含まれていません。" (あなたのスクリプトを実行するのを待っているパーサーに依存する 'document.write'だけでなく、あなたができることが他にもあるので)。**すべての** DOMの修正が表から外れているという印象を与えてはなりません。 –