28

ECMAScript の "use strict" をグローバルに有効にする方法と似ていますが、同じではありません。

JavaScript パターンを購入しましたが、use strict を有効にすることを推奨しています。2ダースのJavaScriptファイルに追加するのは少し面倒なので、グローバルに有効にするといいでしょう. 私はもともと、次のように main.js の先頭に追加することを考えていました。

"use strict" 
require({
    priority: ["jquery", "raphael", "myapp"] 
});

しかし、そのファイルに対してのみ有効になるのではないかと考えました。それから私はこれについて考えました:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

これらのいずれかで ECMAScript 5 の厳密モードがグローバルに有効になりますか?

4

3 に答える 3

44

TL; DR

いいえ、"use strict"1つの要素のaは、他の要素のコードにscript課しません。それが含まれているソーステキストにのみ適用されます。"use strict"script

(これとは別に、script質問の最後にあるタグを再確認してください。要素にが含まれている場合、そのscript要素に含まれるsrcインラインテキストはすべて「ドキュメント」と見なされ、無視されます。)


更新

仕様では、(ES5では明確だったかもしれませんが、私にはわかりませんでしたが)はい、別々scriptの要素がの目的のために別々であることがより明確になりました"use strict"。以下の元の回答の引用は、「コード単位」ではなく「ソーステキスト」となるように少し変更されており、「スクリプトとモジュール」セクションでさらに詳しく説明されています。


元の答え

仕様によると:

厳密モードは構文コードユニットのレベルで選択されるため、厳密モードは、そのようなコードユニット内でローカルに影響を与える制限のみを課します。厳密モードでは、複数のコードユニット間で一貫して動作する必要があるECMAScriptセマンティクスの側面を制限または変更しません。

(セクション4.2.2)

したがって、問題は次のとおりです。異なるscriptタグは異なる構文コード単位ですか?

V8(Chrome内のJavaScriptエンジン)は、それらが分離していると信じているように見えるため、ページの上部にグローバルスコープで単一を配置"use strict";することは機能しません。まだ見つけていない場所で指定されているかもしれませんが、いずれにせよ、それは合理的な解釈です。

その宣言が表示されていないと仮定すると、このコードは通常モードの暗黙のグローバルの恐怖のfoo餌食になります。

function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}

通常モードではfoo、値が「bar」の新しいグローバル変数が作成され、"foo = bar"メッセージが表示されます。foostrictモードでは、が未定義であるため、例外がスローされます。

このスクリプトタグをページに配置すると、次のようになります。

<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>

おそらく同じ理由で、例外()は発生しません。

ここにあるサンプルタグに注意してください。

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

無効です。scriptタグには、属性またはコンテンツのいずれかを含めることができますが、両方を含めることはできません。(基本的に、詳細はここ[HTML5]とここ[HTML 4.01]です。)要素がある場合、ブラウザーはコンテンツを無視することになっていますが、ほとんどの場合は無視されます。多くの。:-)srcsrc

于 2011-06-26T12:21:31.793 に答える
8

JSLintが突然報告しています:「use strict」の関数形式を使用してください

(function () {
    "use strict";
    // put all of your strict code here


}());
于 2012-04-12T20:49:19.113 に答える
6

いいえ、スクリプトタグが考慮されprograms、そのために使用されますcode units"use strict"あるスクリプトタグから別のスクリプトタグに持ち越してはなりません。

各スクリプトタグは個別に解釈され、実際には独自のスコープを持っています。グローバルに宣言されたものはすべてグローバルオブジェクトに到達するため、このスコープは目立ちませんが、それでも存在します。文字列にはポインタ/参照がないため、文字列は/scriptタグ"use strict"の最後でガベージコレクションされます。program

于 2011-06-26T12:50:25.710 に答える