最近はJavaScriptの学習が進み、自分で一からコーディングを行うだけではなく、公開されているwebサイトのソースコードの内容や構造を読み取る練習も行っています。
今回はJSファイルの読み取り中に見つけたuse strictの意味を下記のリファレンスで調べた時に感じた疑問点と、その回答を自分用の備忘録として残しておこうと思います。
use strict の意味については上記のリファレンスを読んだ方がずっと分かりやすいと思うので、本題の疑問点から…
この構文には、著名なサイトを悩ませた落とし穴があります。それは、競合しないスクリプトをむやみに連結できないことです。Strict モードのスクリプトと非 Strict モードのスクリプトを連結することを考えてみてください。連結後のスクリプト全体が strict になるのです! これは逆も言えます。非 Strict のスクリプトと Strict のスクリプトを連結すると非 Strict になります。もちろん、スクリプトの連結は決して理想的なものではありませんが、どうしても必要な場合は、機能ごとに Strict を有効にすることを検討してください。
引用文の中の「競合しないスクリプトをむやみに連結できない」の一文をはじめて読んだ段階の自分はそもそも「スクリプトを連結するって何だ…?」から始まり、
スクリプトを連結する=複数の人が作成したコードを一つのJSファイルの中にまとめておく事?
なのか、
スクリプトを連結する=HTMLファイルに複数のscriptタグを作成したり、複数の外部JSファイルを読み込む事?
なのか、判断がつきませんでした。
仮に後者が「スクリプトを連結する」事だとすると、グローバルスコープではなくて、最初から狭い適応範囲の関数の文頭にuse strictを書いた方が良いのでは…??など、疑問が絶えませんでした。
上記の疑問を解決するには、グローバルスコープにuse strictを記述した際に、どこからどこまでの範囲にstrictモードが適用されるのかを調べる事で解決すると考えた自分がたどり着いたサイトが…コチラ
ただし、ちょっと注意点がありJavaScriptを外部ファイルで読み込ませ、そこに『"use strict"』を記述した場合はその外部ファイル内のみ、script要素を使ってインラインで『"use strict"』を記述した場合はそのscript要素内のみが『strictモード』の対象となります。
探している答えはこのページに大体書いてありました。とても助かります。
更に、何故複数のスクリプトを統合する必要があるのかについても記載されていました。
最近のウェブサイト構築では通信負荷とファイル容量を下げつつレンダリング速度を向上させる目的で複数のJavaScriptを結合してさらにそれを圧縮してから公開するといった手法が取られています。
ここまでの疑問と回答をまとめると
スクリプトを連結する = 複数のJSファイルを一つにまとめる
use strictは記述された範囲の中でだけで適用される機能
<script>
"use strict";
// このタグ内はstrictモード
</script>
<script>
// このタグ内は通常のJavaScript
</script>
<script src="strictモードのJSファイル"></script><!-- このファイル内はstrictモード -->
<script src="通常のJSファイル"></script><!-- このファイル内は通常のJavaScript -->
ということが分かりました。
…初歩的な事だとは思うのですが、小さな事でも疑問が解決するとスッキリとした気持ちになるので、これからも引き続き色々調べていこうと思っています。