32

モジュールパターンを使用していて、次のようなものがある場合:

(function () {
   "use strict";
   // this function is strict...
}());

Google Closure Compiler を使用してコードをコンパイルすると、"use strict";ディレクティブはコンパイル済みファイルになりません。

では、Closure Compiler が ES5/strict ディレクティブを削除しないようにするにはどうすればよいでしょうか?

(コンパイルされたファイルの最初の行に「use strict」を追加するだけの、ES5/strict モードを強制する他のモードを使用したくないことに注意してください。ここで説明されているモジュール パターンを使用したい.)

4

5 に答える 5

53

更新: コンパイラで厳密モードがサポートされるようになりました。

を使用するだけ--language_in=ECMASCRIPT5_STRICTです。

参考文献:

http://code.google.com/p/closure-compiler/issues/detail?id=69

http://code.google.com/p/closure-compiler/source/detail?r=873

http://code.google.com/p/closure-compiler/source/detail?r=1114

于 2011-07-16T16:35:30.240 に答える
10

これは最高の答えではありませんが、私が知る限り、これはクロージャコンパイラの既知の問題または「機能」(あなたの視点に応じて) です。関連する問題の一部を部分的に説明します。言及されたカップルは、複数のファイルが結合されたときにファイルレベルの厳密モード宣言を保持する方法がなく、コンパイラの関数インライン化機能が関数レベルの厳密モード宣言の範囲を壊してしまうことです。「use strict」宣言の振る舞いはコンパイルされたコードでは予測できない/間違っているため (厳密モードが非厳密コードに誤って適用されると、プログラムが壊れる可能性があります)、コンパイラーは他のデッドコードと同様にそれらを削除します。

コンパイラに ECMAScript 5 の厳密モード チェックを完全に実装するというアイデアがあったようですが (その場合、コンパイル済みコードから削除しても問題はありません)、まだ実装されていません。

SIMPLE_OPTIMIZATIONS代わりにモードでコンパイルADVANCED_OPTIMIZATIONSするとデッドコードの削除が無効になりますが、あなたはすでにそれを知っていると思います.

于 2011-01-03T05:20:03.240 に答える
8

危険です。拡張モードの Closure Compiler は、strict モードと互換性がありません。つまり、コンパイラはECMAScript 262 rev 3ルールに基づいてコードを書き換えます。一部の規則が厳密モード用に変更されています (たとえば、無名関数での "this" バインディング、スコープ解決など)。言語の仮定が間違っているために Closure Compiler がコードを誤って書き換えると、コードの破損が発生します。

短い答え (および Closure Compiler の公式の答え) は、「やらないこと」です。

本当に「use strict」文字列をシャベルしたい場合は、次のことを試してください。

eval('"use strict";');
于 2011-03-10T03:10:01.613 に答える
1

コンパイラの出力ラッパーを使用してモジュール ラッパーを作成し、そこに「use strict」ディレクティブを含めることができます。

于 2011-02-09T00:16:26.560 に答える
0

Strict モードはデバッグに役立ちますが、すべての主要なブラウザーに採用されるまではあまり役に立ちません。Closure Compiler がタグを削除する頃には、とにかく便利な時代は終わっています。その機能が実際に役立つようになるずっと前に、彼らはタグを保持できるようにコンパイラを更新すると確信しています。

于 2010-12-16T18:25:37.823 に答える