質問: outer(); f(); // 1 f(); // 2 f(); // 3 ``` なぜ上記のような結果になるのかわかりません。 関数内関数で x + 1がxに代入されているので、最初のfは2ではないのでしょうか? alert(x)以下の式はalert(x)には関係ないのでしょうか。 また、最初に定義されているx=1は、2回目のfでは関係ないのでしょうか。 よくわかっていないのでわかりづらい文章ですが、教えてください。
回答: > > 関数内関数で x + 1がxに代入されているので、最初のfは2ではないのでしょうか? > > > `alert`関数によるダイアログ表示が, `x=x+1`の実行**前**に呼び出されている以上, 出力される内容は初期値である`1`です. また, `alert`関数はスクリプトの実行をブロックするため, この時点ではまだ関数`f`の処理は**完了していません**. > > alert(x)以下の式はalert(x)には関係ないのでしょうか。 > > > 次回の関数`f`呼び出しに影響する処理が記述されているため"関係ない"とは言えません. > > また、最初に定義されているx=1は、2回目のfでは関係ないのでしょうか。 > > > `outer`関数呼び出し時に生成されたスコープを関数`f`が参照し続けているため, そのスコープで定義された変数`x`は残り続けます. ただし`x=1`という代入処理は`outer`関数呼び出しの際に一度だけ行われます. NOTE: `alert`と`x=x+1`の行を入れ替えたコードを実行し, その動作の違いについて比べてみて下さい. ``` function outer(){ var x = 1; return function (){ x = x + 1; alert(x); }; } var f = outer(); f(); // ? f(); // ? f(); // ? ```