2011-11-11 7 views
3

Javascriptでは、の中では使用できないさまざまなものがあります。reserved words;それらのうちのいくつかは、将来の使用のために実際に予約されている。ビットを明確にするため、IdentifierIdentifier Nameですが、予約語はありません。識別子名の正確な文法はここでは関係ありません。JavaScriptでの予約語の使用

the last paragraph hereによれば、予約語であってもIdentifier Nameを使用するのが有効なところがあるようです。記事では、第二の形式が合法であることを私に明らかですが

a.import 
a["import"] 
a = { import: "test" } 

有効なものとして言及し、私はいつも第一および第三のではなかったと思いました。実際に

this resourceは無効コードとして

foo.if 

を意味します。動機として

Are there some places were reserved words are actually valid?

、私はそれが形

{ 
    in: foo, 
    out: bar 
} 

のオブジェクトを渡すことが意味をなすだろうが、私はinの周りに括弧を置くためにユーザーを強制したくないAPIを書いています。

+0

"in"と "out"が意味的に意味のあるものになっている場合は、ユーザーがそれらを引用する必要があっても使用してください。 (私はあなたが "大括弧を入れない"引用符を置くことを意味すると仮定します)。 – nnnnnn

+0

はい、私は引用符を意味しました – Andrea

答えて

5

これは、エディション3と5の間のECMA-262の変更点です(get here)。両方のエディションで

は、セクション7.6は、セクション11.2において、

Identifier :: 
    IdentifierName but not ReservedWord 

しかしとして識別子を定義します。ドット表記を使用して1、プロパティアクセサは、ドットアクセサが実際に合法であるとして、すなわち予約名を使用して、5版で

MemberExpression . IdentifierName 
CallExpression . IdentifierName 

に版3に

MemberExpression . Identifier 
CallExpression . Identifier 

から変更されました。

予約語のどれもが今まで合法的に.をたどることができなかったため、またはそれはまた、様々な実装の既存の慣行を成文化した場合識別子に制限が構文的に不要であるという理由だけで、この変更が行われた場合、私は知りません。

PS:ECMAScriptの3.1は今のECMAScript 5として知られているもののため、元の名前だったこと

The ES3 grammar does not allow reserved words (such as true and false) to be used as a PropertyName or to the right of the period in a MemberExpression. Your tests verify that most implementations conform to that restriction while FF has a "non-standard" extension that allows reserved words (or at least the ones you tested) to be used in those contexts.

ES3.1 intentionally adopted the FF extension as a standard part of the language, so when the other implementation are eventually updated to support ES3.1 they should no long report errors for your test cases.

注:いくつかの掘削後、私は5版のためmail from Allen Wirfs-Brockで、次、プロジェクトエディタを見つけました。

+0

ありがとう、これは私が必要としていたものです! :-) – Andrea

1

ほとんどのブラウザはa.importにエラーを表示しませんが、厳密には合法ではありません。予約語を使用したい場合は、それを引用する必要があります。

訪問http://wwwjslint.com、とは、次のコードを貼り付けます。

var d = { 
    'in': 1 
}; 

このコードが有効です。あなたが引用符を削除すると、ただし、エラーが生成されます。

Problem at line 2 character 5: Expected an identifier and instead saw 'in' (a reserved word).

+0

それは本当に私の質問に答えることはありません。はい、jslintは文句を言っていますが、私はCrockfordがこの権利を持っているかどうかわかりません。もちろん、すべての文字列を引用符で囲んでプロパティ名として使うことができます。しかし、私はMDNの人たちが引用を省略できると主張しているのだろうと思っていました。私は自分が見つけられなかった仕様の関連部分へのリンクをもっと探していました。 – Andrea

+0

@Andrea JavaScriptコンソールを召喚し、 'var d = {a:1}'と打ちます。結果は '{a:1}'です。 '{import:1}'を入力すると、次のエラーが表示されます: 'SyntaxError:importは予約済み識別子です'。 (Firefox 7.0.1)。この問題の「実際の」例については、http://userscripts.org/topics/77990をご覧ください。開発者は予約語を知らず、困っていました。 –

+0

@RobW - 'var d = {import:1};'は私のためにエラーを投げません。 –

1

MDNの記事は、Firefoxが準拠するECMAScript 5の仕様を、引用しているが、すべてのブラウザでは、このように、それに適合していない、つまり、すべてのブラウザではありませんEcmascript 5に準拠しています。

1

引用符で囲まれていない場合は、すべてのブラウザ/実装で動作するとは限りません。

「入力」と「出力」のようなものに変更しようと考えています。引用符を必要とする "in"に関するドキュメントに追加する余分な文章は、おそらく "完全な"識別子名を持つ利点はありません。

関連する問題