似ていますが、同じではありません ECMAScriptをグローバルに「厳密に使用」できるようにする方法は?
JavaScript Patterns を購入しましたが、厳密な使用を有効にすることをお勧めします。それを20個のjavascriptファイルに追加するのは少し面倒なので、グローバルに有効にするのはいいことです。私は当初、次のようにmain.jsの先頭に追加することを考えていました。
"use strict"
require({
priority: ["jquery", "raphael", "myapp"]
});
しかし、私はそれがおそらくそのファイルに対してのみそれを有効にするだろうと思いました。それから私はこれについて考えました:
<script data-main="lib/main" src="lib/require.js">"use strict"</script>
これらのいずれかがECMAScript5の厳密モードをグローバルに有効にしますか?
TL; DR:
いいえ、1つのscript
要素の"use strict"
は、他のscript
要素のコードに"use strict"
を課しません。それが含まれているソーステキストにのみ適用されます。
(これとは別に、質問の最後にあるscript
タグを再確認してください。script
要素にsrc
がある場合、そのインラインテキストは「ドキュメント」と見なされ、無視されます。 。)
更新:
はい、別々のscript
要素が"use strict"
の目的のために別々であることが、現在の仕様でより明確になっています(ES5では明確でしたが、私にはわかりませんでした)。以下の元の回答の引用には、 わずかに変更されています 「コードユニット」ではなく「ソーステキスト」と書かれています。 スクリプトとモジュール セクションでさらに詳しく説明します。
元の回答:
仕様 は言う:
Strictモードは構文コードユニットのレベルで選択されるため、strictモードは、そのようなコードユニット内でローカルに影響を与える制限のみを課します。厳密モードは、複数のコードユニット間で一貫して動作する必要があるECMAScriptセマンティクスの側面を制限または変更しません。
(セクション4.2.2)
したがって、問題は次のとおりです。異なるscript
タグは異なる構文コード単位ですか?
V8(Chrome内のJavaScriptエンジン)は、それらが分離していると信じているように見えるため、単一の"use strict";
をグローバルスコープの上部に配置しますあなたのページは機能しません。おそらく私がまだ見つけていない場所で指定されているかもしれませんが、いずれにせよ、それは合理的な解釈です。
表示されていないfoo
の宣言がないと仮定すると、このコードは通常モードで The Horror of Implicit Globals の餌食になります。
function test() {
try {
foo = "bar";
display("foo = " + foo);
}
catch (e) {
display("Exception: " + e);
}
}
通常モードでは、値が「bar」の新しいグローバル変数foo
が作成され、"foo = bar"
メッセージが表示されます。 strictモードでは、foo
が未定義であるため、例外がスローされます。
このスクリプトタグをページに配置すると、次のようになります。
<script>
"use strict";
function test() {
try {
foo = "bar";
display("foo = " + foo);
}
catch (e) {
display("Exception: " + e);
}
}
</script>
...期待どおりに例外が発生します( 実例 )。ただし、それらを別々のscript
タグに入れると、次のようになります。
<script>
"use strict";
</script>
<script>
function test() {
try {
foo = "bar";
display("foo = " + foo);
}
catch (e) {
display("Exception: " + e);
}
}
</script>
私は例外を取得しません(V8の場合)( 例 )。そして、ブラウザとJavaScriptエンジンがどのように相互作用しているかを考えると、それは合理的です。
同様に、関数が別のファイルでオフになっていて、これを行う場合:
<script>
"use strict";
</script>
<script src="/inatoq"></script>
おそらく同じ理由で、例外( example )は発生しません。
ここにあるサンプルタグに注意してください。
<script data-main="lib/main" src="lib/require.js">"use strict"</script>
無効です。 script
タグはどちらかにsrc
属性またはコンテンツを含めることができますが、両方を含めることはできません。 (基本的に、詳細 ここ [HTML5]および ここ [HTML 4.01]。)src
要素がある場合、ブラウザーは無視することになっています。コンテンツ、そしてほとんどがそうです。最も。 :-)
JSLintが突然報告しています:「usestrict」の関数形式を使用してください
(function () {
"use strict";
// put all of your strict code here
}());
いいえ、スクリプトタグはprograms
と見なされるため、code units
。 "use strict"
あるスクリプトタグから別のスクリプトタグに持ち越してはなりません。
各スクリプトタグは個別に解釈され、実際には独自のスコープを持っています。グローバルに宣言されたものはすべてグローバルオブジェクトに到達するため、このスコープは目立ちませんが、それでも存在します。文字列"use strict"
は、ポインタ/参照がないため、program
/scriptタグの最後にガベージコレクションされます。