VSクロージャ(javaScript)
以前からクロージャというものがわからずにいた。
私がメインで書いているのはSwiftなんですがクロージャからは逃げて生きてきた。しかしある本を読んでいる際javaScriptでクロージャを扱ったコードにぶつかり戦って勝利しました。(※最強プログラマ達の助けを借りました)
本の中に出てきた敵はこんなコードでした。 カウントアップして行くようなやつ
function makeCountor(){ var count = 0; function push(){ count++; conlose.log(count); } return push; } c = makeCountor(); c(); //->1 c(); //->2 c(); //->3
これをみて私がずっとモヤモヤしていたところがありました。
var count = 0;
こいつです。初期化してるやないかーい!
つまり
c = makeCountor(); c(); //->初期化されて0 c(); //->初期化されて0 c(); //->初期化されて0
絶対こうなると思っていました。だってvar count = 0;だし..
これはテラテイルに質問を投げた後に気づいたのですが、根本的な勘違いをしていました。
c = makeCountor();ここで何が起こっているかというとmakeCountor()関数のreturnで返された値が変数cの中に代入されています。すごい初歩的な話なのですが、私はcの中にmakeCountor関数が全て入っているものだと勘違いをしていました。
実際に返されているものはreturn push;つまり!
function push(){ count++; conlose.log(count); }
makeCountor関数内にあるpush関数なのです。理解してから考えるとすごい当たり前ですが、クロージャへの苦手意識からクロージャだからできるんじゃないかと疑心暗鬼になって頭の中がこんがらがっていました。
c = makeCountor(); //この行で1度だけ初期化が行われていますつまりcount = 0; c(); //cの中にある関数を実行している...つまりpush関数を実行 count++; c(); //上に同じ c(); //上に同じ
push関数はcountをmakeCountorの中に見に行っています。しかし初期化はしていないのでcountの値は引き継がれてどんどんカウントアップして行くという結果です。
僕の頭の整理をかねて書き殴ってしまいましたが、誰かの理解の助けになれば幸いです。
teratail.com ※僕の幼稚な質問に答えたくれた最強プログラマ達の回答はここです