2016-11-14 7 views
4

クローム開発者コンソールにランダムなコードを書き込んでいました。驚いたことに、letは完全に間違っている変数名としてletを使用しました。letは予約済みのキーワードです。私はなぜこれが起こっているのか理解する必要があります。変数名として 'let'を使用すると、Google v8でエラーが発生しない

シナリオ:

var const = 78 //throws an error as expected 

var function = 46 //throws an error as expected 

var let = 56 //didn't throw an error :O 

let //prints 56, which is wrong because 'let' is a keyword 

let ab = 90 

ab //prints 90 as expected 

この欠陥はnodeに存在します。しかし、私がBabel REPLで試してみると、それはエラーを投げています。

私は、これは、GoogleのV8

+1

なぜ予約語を使用しないのはなぜですか? – mplungjan

+0

答えとして投稿するのは不明ですが、これは古いコードが破損しないようにするためだと思います。 ES2015より前のアプリで「let」という変数を使用していた場合はどうなりますか? –

+0

私はそれを手に入れます。 「予約語」の正式なリストがある場合、v8はそれに従わないのはなぜですか?私はそれが間違いを起こすと思います。 –

答えて

6

この背後にある理由の素敵な書き込みアップはthis article by Mohsen Azimiで見つけることができます。ここでそれの簡単な要約です。

次のキーワードをFutureReservedWordとしてJavaScriptの仕様で定義されている:

ノーマルモードで
implements  interface let  package private 
protected  public  static yield 

、これらはエラーなし変数名として使用することができます。しかし、strictモードでそれらが予約語として扱われ、次のエラーがスローされます。

SyntaxError: Cannot use the reserved word 'let' as a variable name in strict mode. 

壊れない前ES2015コードようにこれは - 誰かがレガシーでその変数letの多くを命名していた場合JSの仕様が突然すべて破られたなら、おそらく幸せにならないでしょう。

+0

清潔。私はまだv8の人々にレガシーアプリケーションを修正するための '非推奨'警告を追加するよう提案します。 –

+0

@PraneshRavi:ええ、私はいつも ''厳密に使う ';'というようなことに、ちょっとした解決策を見つけました。特にJSアプリケーションは、たくさんの別々のファイルに分割される傾向があります。 –

+0

それはJavascriptのものですが、非推奨ではありません。厳密なコードでは許可されていません。 ES6モジュールが起動すると、ほとんどの新しいコードが使用するほうが優れており、デフォルトでは厳格ですが、ES6以外のモジュールで 'use strict'を忘れてしまった場合には、lintingルールを設定するのも比較的簡単です。 – loganfsmyth

6

の予約ES6キーワードの使用は互換性のためだけstrictモードで禁止されているとは何かだと思います。

Babel(strict mode plugin経由)は、デフォルトでstrictモードを使用します。ブラウザまたはノードで、ファイルまたは関数の先頭に"use strict";を追加して、暗黙的にstrictモードを設定できます。あなたはそれを期待してChromeでエラーがスローされます、次のコードスニペットを実行

"use strict"; 
 
var let = 43; 
 
// Throws: Uncaught SyntaxError: Unexpected strict mode reserved word

関連する問題