web-dev-qa-db-ja.com

予約語でない場合、ES6で「yield」をキーワードとして追加するにはどうすればよいですか?

yieldはJavaScriptでは 予約語 ではありませんが、ES6はそれをキーワードにします。

予約語のポイントは後方互換性のためだと思いました。たとえば、letconstは予約されているため、ES5コードでこれらの単語を変数名として使用できませんでした。これにより、ES5コードがES6エンジンで正常に実行されるようになります。

...しかし、変数名としてyieldを使用した場合はどうなりますか?なぜこの言葉は予約されなかったのですか?そして、それが問題ではない場合、なぜany語が予約されたのですか?

4
callum

ECMAScript 5では、yieldは厳密モード " Future Reserved Word ":

7.6.1.2将来の予約語

以下の単語は提案された拡張機能のキーワードとして使用されているため、それらの拡張機能の将来の採用の可能性を考慮して予約されています。

...

class enum    extends super
const export  import  

次のトークンは、ストリクトモードコード内で発生した場合もFutureReservedWordsと見なされます(10.1.1を参照)。 FutureReservedWordが発生するとエラーが発生するコンテキストで、厳密モードコード内にこれらのトークンが発生すると、同等のエラーも発生するはずです。

implements  let      private    public  yield
interface   package  protected  static    

これは、厳密でないコードでは、懸念が正しいことを意味します。行の正確さvar yield = 5;は、非厳密モードではES5とES6の実装で異なります。ただし、厳密モードでは、ES5とES6のどちらの場合も、この行は常に無効です。つまり、ES5コードの上位互換性を最大化するために、可能な場合は常に厳密モードを使用する必要があります。

why歩留まりが非厳密コード用に完全に予約されていなかったので、これはES3間の互換性をブリッジするために行われたと想定し、yieldFutureReservedWord(14ページの ES3セクション7.5.3を参照 )。 yieldを導入するために、委員会は3から5への移行または5から6への移行のいずれかで互換性をどこかで破壊する必要がありました。ただし、ES3に含まれていた一部の予約語は、ES5では完全モード予約語にダウングレードされました。その決定の根拠はわかりません。

6
apsillers