javascript初心者です。
クロージャやらスコープ周りを勉強していると混乱してきました。。。
どなたかお助けください。。。
質問1
まずクロージャの理解が合ってるか知りたいです。
例えば次の様にクロージャを生成する関数があったとします。
function testScope () { let funcs = {} let n //(外側のn) for (n = 0; n < 3; n++) { funcs[n] = () => n //(nを閉じ込め) } return funcs } console.log(testScope())
funcs[1]
〜funcs[3]
にクローズされた変数n
は、それぞれ外側のn
を参照するので、結果同じ値を取るという認識でおります。
↑
n++
されて3
となったn
を見てる、と捉えているんですが合ってますでしょうか。。
質問2
for文でletを使うと何が起こっているのか知りたいです。
上記例でfuncs[1]
は1
を、funcs[2]
は2
を保持しようとすると次の様にできると思います。
function testScope () { let funcs = {} for (let n = 0; n < 3; n++) { //外側でなく、for初期化でnをletで宣言 funcs[n] = () => n } return funcs } console.log(testScope())
するとコンソールログ上で狙いの挙動になります。
※ChromeDevToolで見るとトップレベルが{0:f,1:f,2:f}
からObject
になってますが、スコープのタイプがClosure
からBlock
に変わったことと関係あるんでしょうか???)
ここで、なぜ各ループでn
が使われているのに、結果的に違うn
を参照できてるんでしょうか。
これはつまり「次のループに移るとスコープが変わってる」ということでしょうか??????
だとすれば(実際に行われてる内部処理は分かりませんが)for文は次のようなブロックスコープを生成するイメージで合ってますか?
function testScope () { let funcs = {} { let n = 0 funcs[n] = () => n } { let n = 1 //前回ループとは別のn funcs[n] = () => n } { let n = 2 funcs[n] = () => n } return funcs }
諸々理解が追いついておらず質問が的を射てないかもしれませんが、何卒ご回答の程よろしくお願いします。。。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/10 15:04
2018/02/10 15:09
2018/02/10 16:07 編集
2018/02/10 16:17
2018/02/12 04:29 編集