2016-09-08 14 views
6

私はこの奇妙な動作を説明するアニメーションGIFを添付しました。基本的に、私の質問は、同じ範囲で使用すると、Chromeのコンソールでvarletを別々に扱うのですか?変数を宣言/割り当てした後で、その変数の名前をコンソールに入力しようとすると、Chromeによって自動的に入力され、入力内容を含むドロップダウンリストが表示されます。 letを使用する場合、これは当てはまりません。これはバグですか、機能ですか、またはvarletについて、JavaScriptには何か不足していますか?Chromeコンソール: 'let'と 'var'の違いは?

注:私は、の寿命が&であり、即時の範囲内で死ぬことをよく認識しています。

enter image description here

+3

クロム開発チームのメンバーではないが、私はa)彼らはオートコンプリートでグローバルスコープ変数のみを探すか、b)まだletのためにそれを実装していないかc)それを実装するのを忘れた – baao

+3

ちょうど好奇心から、あなたはどのようにそのGIFイメージを作ったのですか? –

+0

@OrkhanAlikhanov yeeeees。それは質問の中で最も興味深い部分です! – baao

答えて

9

varをコンソールで使用すると、グローバルスコープで実行され、変数がwindowオブジェクトに追加されます。

letをコンソールで使用すると、グローバルスコープで実行されます。グローバルスコープでは、変数がwindowオブジェクトに追加されません。

タイピングを開始すると、オートコンプリートでは、親オブジェクトのプロパティがチェックされ、function,forwhileなどの他の言語構造と一致することが確認されます。

コンソールには、コンテンツが存在しない場合には、親オブジェクトがletwindowにプロパティを追加しませんので、あなたが探しているプロパティを持っていないであろう、windowです。

オートコンプリートを完了するための新しいオブジェクトを取得すると、動作は期待どおりに戻ります。

> let foo = {bar: 'baz'}; 
> foo.b //autocompletes bar 

今、言ったことの全てで、オートコンプリートがそのように動作するようにを持っている理由はありません。多くの点で、letを介してグローバルスコープで定義された変数のオートコンプリートの不足は、「修正」する価値のある「バグ」とみなすことができます。私の意見では、それはやや驚くべき振る舞いです。

1

varletのみローカルスコープでそれを定義しながら、グローバルスコープに変数を定義します。おそらく、オートコンプリートはターゲットのグローバルスコープを調べるだけです。

+0

それはすべて論理的です。しかし、今では2017年の終わりにchromeは 'let'変数を自動完成させていません(Firefoxはそれを行いました。)' 'let''変数の自動補完方法について知っていますか? –

関連する問題