2016-04-15 21 views
9

時間的デッドゾーンの外に変数を聞かせてください。ただし、nullは構造化することができないため、割り当てによってTypeErrorがスローされます。このコードは参照してください

foo = 123; // ReferenceError: can't access lexical declaration `foo' before initialization 

そしてlet変数が再宣言することはできません:

問題はその後foo変数が宣言されていますが、初期化されていないので、第二スクリプトで、私はfooを参照しようとすると、それがスローされていることである

let foo = 123; // SyntaxError: redeclaration of let foo 

TDZから取り出して値を割り当てて読み取る方法はありますか?

+0

ところで、私は 'foo'を使いたいのですが、' window.foo'のような回避策ではありません。 – Oriol

+0

私は初期化の妥当性を保証するのを困難にする最初のスクリプトについて面白いことがあると思います。 – Pointy

+0

@Oriol: 'window.foo' [とにかく動作しない](http://stackoverflow.com/q/28776079/1048572):-) – Bergi

答えて

2

不可能です。一時的なデッドゾーンと初期化されていないlet変数へのアクセスが制限されていることは避けられないと予想されます。それは混乱し問題を抱えていますが、意図され、期待されています。

詳細はspecを参照してください:

NOTEてみましょうと、const宣言は、実行中の実行コンテキストのLexicalEnvironmentにスコープされた変数を定義します。 変数は、そのLexical Environmentが含まれている場合に作成されますが、変数のLexicalBindingが評価されるまではアクセスされません。 Initializerを持つLexicalBindingで定義された変数には、変数が作成されたときではなく、LexicalBindingが評価されたときのInitializerのAssignmentExpressionの値が割り当てられます。 LET宣言のLexicalBindingは、変数は宣言で初期化されていない場合。LexicalBindingが評価されたときに変数が未定義の値を割り当てられているので、\

を初期化子を持っている(と初期化の前に投げていない場合は、明らかに無になりますどのような手段でもアクセスすることはできません。

実際、あなたの問題はassigmentを投げるよりも複雑です。アーキテクチャの問題です - あなたは可変グローバル変数に依存しています。それは大きな「no no no」です。明示的な依存関係を使用するようにコードをリファクタリングする必要があります。

関連する問題