2017-12-11 14 views
6

下記の2つの方法に違いはありますか?なぜ私はどちらを使うべきですか?letでjavascriptを再割り当て

while (true) { 
    let test = getValue(); 
    .... 
} 

そして

let test; 
while (true) { 
    test = getValue(); 
    .... 
} 

答えて

8

letはそれだけ{...}ブロック内に存在することを意味ブロックスコープあります。

testのみをブロック内(外部ではない)で使用する場合は、このフォームを使用してください(同じブロック内の値を変更しない場合、letは不要です)。

while (true) { 
    const test = getValue(); 
    .... 
} 

あなたはwhileループの外側からtestにアクセスする必要がある場合は、このフォームを使用する必要があります。

let test; 
while (true) { 
    test = getValue(); 
    .... 
} 
+0

'const test'は各繰り返しの後に設定されていないので、ループ内でconstを使うことができますか? – unska

+0

はい新しい 'test'変数が各反復の間に作成されます。各反復中にオーバーライドする必要がないかぎり、ループ内で使用できます。 – klugjo

+0

恐ろしい、それを知らなかった。ありがとうございました! – unska

2

うんあなたは、whileループの外で変数のテストにアクセスすることはできません最初のバージョンの違いがあります。 2番目のバージョンでは、ループ外のテスト変数にアクセスできます。

+0

になってしまいます実行可能なコード例を与えることはありません。私は、同じ変数に複数回letを使用することには欠点があるのだろうかと思っています。 – unska

+0

いいえ欠点はありませんが、変数をブロック内でのみ使用する場合はブロック内で宣言する必要があります。読みやすさの理由から。 –

+0

@unska 'let'は変数のスコープを決定します。関数より小さいスコープ、つまり' while'ブロックや 'if'ブロックで明示的に使われることを意図しています。これはまさに 'let'を使う意味です。 – deceze

4

あなたはwhileループの外にテスト変数を使用する場合は、第二に行く:

let test; 
while (true) { 
    test = getValue(); 
    .... 
} 
if (test) { ... } // <--- Use test outside the while loop 

それ以外の場合は、最初のものは最初のバージョンでは

+0

letを同じ変数に複数回使用することには、欠点はありませんか? – unska

+0

いいえ、問題ありません – Faly

2

優れている、変数のスコープは、しばらく制限されています一方の変数はループ中に外部からアクセスすることができます。

1

ええ、両方の違いがあります。

  • あなたはループの外で変数を宣言した場合、ループ外に他のコードでアクセスできるようにループ&でを更新することができます。

  • ループ内で宣言した場合、は、ループからアクセス可能な&のみ更新できます。

3

はい、違いがあります:

  • 最初の例では、各ループ反復のための独立したtest変数を持っています。 2番目のケースでは、すべてのループ反復で変数が1つだけtest共有されます。ループ内に関数を作成してパフォーマンス面を持つことができれば、重要な効果があります(もちろん、すべてのパフォーマンス面のように、問題が発生した場合にのみ問題になります)。
  • 最初の例では(それぞれ)test変数はループ内でのみアクセス可能です。 2番目の変数では、ループの外側で変数testがアクセス可能です。

なぜどちらを使用する必要がありますか?

状況に適したものです。ループごとに個別のtest変数が必要な場合や、ループに対してプライベートにする場合は、最初の変数を使用します。そうでない場合は、2番目の文字を使用します。変数のみ中括弧のその周囲のペア内存在することを意味 -

+0

最初のアプローチでは、変数「test」は、囲み関数が返ってきたときにガベージコレクションのためにスケジュールされます(閉じたケースは考慮しないでください)。しかし、第二のアプローチはどうですか?いくつのメモリ参照が作成され、消去されるでしょうか?作成されたすべての参照は、各反復後にガベージコレクションのスケジュールが設定されますか? –

+1

@RajaprabhuAravindasamy:上記のように、最初のケースでは、ループの繰り返しごとに別々の 'test'変数があります。ループの反復処理が完了したときにGCで利用できるようになりました。 –

0

letブロックスコープを有しています。したがって、ループの後にletの値を出力しようとするこの状況では、undefinedが返されます。この状況で

while (true) { 
    let test = getValue(); 
    console.log(test); // => some value... 
    .... 
} 
console.log(test); // => undefined 

それはwhileループの外に保存されますので、testはすでに、whileループ(中括弧)の前に定義されます:あなたは内部letを使用している場合でも

let test; 
while (true) { 
    test = getValue(); 
    console.log(test); // => some value... 
    .... 
} 
console.log(test); // => still some value... 

注意whileループと同様に、それは同じように扱います:

let test = 5; 
while (true) { 
    let test = 4; 
    console.log(test); // => 4 
    .... 
} 
console.log(test); // => 4, not 5 

あなた自身の特別なブロックスコープ変数を定義しようとしないでくださいメイン1

の独立した私は、そうでなければ、私は今までのブロックの中からアクセスするつもり無限ループ

関連する問題