web-dev-qa-db-ja.com

これにより、グローバルに「厳密に使用」できるようになりますか?

似ていますが、同じではありません 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の厳密モードをグローバルに有効にしますか?

28
graham.reeds

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要素がある場合、ブラウザーは無視することになっています。コンテンツ、そしてほとんどがそうです。最も。 :-)

42
T.J. Crowder

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

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


}());
8
Jeremy Bell

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

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

6
BGerrissen