前提・実現したいこと
初めて質問させていただきます。
現在、JavaScriptを勉強しており、クロージャの概念について学んでいるのですが、わからない部分があります。
まず、以下のコードに対する私自身のクロージャの理解について・・・
JavaScript
1 function makeCounter1() { 2 var count = 0; 3 return f; 4 function f() { 5 return count = count + 1; 6 } 7 } 8 var counter1 = makeCounter1(); 9 console.log(counter1()); //-> 1 10 console.log(counter1()); //-> 2 11 console.log(counter1()); //-> 3
makeCounter1関数の中でさらにf関数を作り、その中でmakeCounter1関数のローカル変数であるcount変数を参照することでガベージコレクションの適応を免れmakeCounter1関数のオブジェクトの値を保持することができる。ということがこの場合のクロージャの機能だと理解しています。
ここまではいいのですが、自分が悩んでいる部分はこのコードを少しいじった次のコードでの問題です。
自分の予測では次のコードでも同じ結果が表示されると考えていました。
JavaScript
1 function makeCounter2() { 2 var count = 0; 3 count = count + 1; //先ほどf関数の中にあったこの部分のコードを外に出した 4 return f; 5 function f() { 6 return count = count; //count変数を参照するためだけのコード 7 } 8 } 9 var counter2 = makeCounter2(); 10 console.log(counter2()); //-> 1 11 console.log(counter2()); //-> 1 12 console.log(counter2()); //-> 1
(count変数に何の変更も加えておらず、何の生産性もないコードではあるが)f関数の中で一応count変数を参照しているためガベージコレクションの適応を受けずに値が保持された状態になり、makeCounter2関数を呼び出すたびにcount変数が1ずつ足されていくのだと思っていたのですが結果はそうではありませんでした。
問題は明らかに count = count + 1; の部分をf間数の外に出してしまったことにあると思うのですが自分の理解ではなぜこの部分がいけないのか発見することができませんでした。
なにかわかる方がいらっしゃいましたらご回答お願いいたします。
これが最初の質問となるので、質問の仕方に不適切・不明瞭な点があるかと思いますがもしよろしければ、その点についても忌憚のないご意見お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/25 08:30
2019/05/25 08:45
2019/05/25 10:28