解決法は既出の通り、do-while
の外で変数宣言を行えばいいのですが、原因を真に理解していますか?
ブロックスコープと関数スコープ
ブロックスコープとは「{}
で括られた領域」の事です。
ブロックスコープを学習したなら、{}の外ではブロックスコープの変数を参照できない事は理解できるはずなのですが、基礎学習を飛ばしてコードを書いていませんか。
ブロックスコープが望ましくないなら、関数スコープを使っても良いですし、ブロックと変数宣言位置を調整すれば、ブロックスコープでも十分対応可能です。
JavaScript
13
4(function (){
5 var closer = function(){
6 let b = 0;
7 return function(){
8 return ++b;
9 };
10 }();
11
12 do {
13 var d = closer();
14 } while(d == 1);
15
16 console.log(d);
17}());
18
1921
22{
23 let closer = function(){
24 let b = 0;
25 return function(){
26 return ++b;
27 };
28 }();
29
30 let d;
31
32 do {
33 d = closer();
34 } while(d == 1);
35
36 console.log(d);
37}
最も、元コードでは変数 d を再利用していないので、他に条件がないなら、下記コードで事足りますけどね…。
JavaScript
1while(closer() === 1);
グローバル変数
var
で宣言された変数は、グローバルコード上を除いて、グローバル変数では有りません。
let
, const
はどこで宣言しても、グローバル変数ではありません。
受け答えを見ると、グローバル変数の認識がおかしいので、そちらもしっかりと学習することをお勧めします。
Re: slimat さん