3

私はこのJSコードを持っています:

var A = {};
A.new = function(n) { return new Array(n); }

すべてのブラウザで問題なく動作しますが、難読化ツールで難読化しようとすると、エラーが表示されます。

有効なJSコードですか?仕様を調べましたが、何も見つかりませんでした。ブラウザが構文的に間違ったコードを受け入れる場合があることは知っていますが、構文的に正しいコードを書きたいと思っています。

私はやっていないことに注意してくださいvar new = ...

ところで。これはどうですか?

var a = { "new" : 2 };  // ok?
a.new    = 3;           // ok?
a["new"] = 3;           // ok?

.

編集: ご協力いただきありがとうございます。難読化ツールの作成者にメールを書いたところ、修正してくれました! :)

4

4 に答える 4

3

プロパティ識別子として予約語を使用できます。

A.new = 1
B = { function: 123 }
D.if = { else: 5 }

など - すべて有効な (必ずしも良いとは限りません) JavaScript です。

これらは仕様では「IdentifierName」と呼ばれ、「IdentifierName」と通常の識別子の唯一の違いは次のとおりです。

Identifier :: IdentifierName but not ReservedWord

http://es5.github.io/#x7.6

于 2013-09-11T19:50:56.737 に答える
3

はい、コードは有効ですが、難読化ツールが間違っています (または古い)。new予約語です。つまり、有効な識別子ではありません(たとえば、変数名として使用されます)。それでも、これはオブジェクト リテラルドット表記のプロパティ アクセスIdentifierNameで有効な です。

ただし、これは EcmaScript 3 には当てはまりません。これらは両方とも sである必要があり、キーワード likeは無効でした。したがって、Web 上のスクリプトでこれらの名前を引用符なしで使用することは、古いブラウザーで実行される可能性があるため、不適切な方法と見なされます。Identifiernew

于 2013-09-11T19:54:17.350 に答える
0

は予約語であるためnew、identifierName としては使用できますが、identifier としては使用できません。ECMAScript 仕様のこのセクションを参照してください。したがって、コードは合法であり、難読化ツールはこの区別を理解していないようです。

これを回避するには、配列スタイルの表記を使用してアクセスできます。

A['new'] = function(n) { return new Array(n); };
于 2013-09-11T19:47:31.780 に答える
0

エラーはありません。ドットで始まる ['new'] と同じように、単なるプロパティ名であり、予約語ではありません。

于 2013-09-11T19:44:12.583 に答える