2017-08-05 7 views
2

私はオンラインのJSコースを受講しており、講師は構文:let = names = ["Bob","Tim","Larry"]を使用しています。私はそれが事故であると確信していますが、何とか彼が使用していたJSの環境で許可されています。彼がやったことは(たぶん偶然に) "名前"変数に配列を割り当てて、それを "let"変数に割り当てました。変数 "let"に値を割り当てるのはなぜですか?

私の質問:なぜこれはエラーではありませんか?変数として「let」を使用できるのはなぜですか?私たちは "let"がキーワードであることを知っています。それとも、まだ違法行為をしていないものなのでしょうか?あなたはChromeとFirefoxのコンソールとNodeでもそれを行うことができます。

+0

興味深い点。 'let = 123'が許可され、グローバルスコープ変数123を作成しますが、' var = 123'はエラーを発生させます。 – cars10m

+0

'let = 123'が動作する環境では' let foo = 123'を実行します。また働く?同じスクリプトで両方を実行できますか? – JeffUK

+0

何らかの理由で、予約されたキーワードのリストにそのキーワードが含まれていませんでした。実際には 'var let = 'something'を実行することもできますが、最初の問題(誤って名前という配列を初期化する代わりに大域変数を代入するのを避けるために、' use strict''をあなたのスクリプト。 –

答えて

2

ES3以前のJavaScriptバージョンでは、letは特別な意味を持たず、識別子として使用できました。しかし、constは、すでに将来の予約語のリストに入っていました。 http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf,7.5.1 予約語を参照してください。

「strictモード」が追加されました。 constは予約語とletがstrictモードで将来の予約語のように扱われるべき将来のリストに残っている:http://www.ecma-international.org/ecma-262/5.1/index.html#sec-7.6.1

ES6はconstletに意味を与えたが、letはまだ予約語ではありません。代わりに、それはhttp://www.ecma-international.org/ecma-262/6.0/#sec-keywordsで述べている:

strict mode code

letstaticは、静的な意味上の制限(12.1.113.3.1.113.7.5.1、および14.5.1を参照)のではなく、字句文法によって予約語として扱われます。

つまり、strictモードの外では、letを変数名として使用して、他の変数を宣言することができます。

letが予約語にされなかった理由は、通常の識別子としてletを使用していた可能性のある既存のコードを破損しないためです。

2

下位互換性の問題があるため、ブラウザが実装しているEcmaScriptのバージョンでは、保存されているキーワードのリストにありません。最近のブラウザでは、.js文書の中に'use strict'という文字を使用して、この動作を無効にすることができます。将来どのようなキーワードを予約するのかについては、今日のブラウザではまだ予約されていない可能性が最も高いリストについては、JavaScript List of Reserved Keywordsをご覧ください。 *とマークされたものはES5 - ES6固有のキーワードであることに注意してください。これは後の時点で実際のリストに追加される可能性が高いことを意味します。

より早い段階でconstが追加されたことに注意してください。このため、今日は予約済みのキーワードであり、正しく実装されています。

関連する問題