[過去ログ] + JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
586(7): デフォルトの名無しさん [sage] 2016/10/16(日) 20:58:57.45 ID:LWTFfjDf(1/12) AAS
JavaScript入門者です。
クロージャで躓いています。
function Counter() {
var n = 0;
return function () {
return ++n;
};
}
var a = Counter();
a(); // 1
a(); // 2
a(); // 3
これでなぜ増えていくのかが分かりません。
a(); を呼ぶ度に、var n = 0; が実行されるはずなので、増えていかないと思うのですが…
なぜ var n = 0; は実行されないのですか?
589(2): デフォルトの名無しさん [sage] 2016/10/16(日) 21:21:34.20 ID:LWTFfjDf(2/12) AAS
>>588書き出してみるには、どうすればいいのでしょうか?
592: デフォルトの名無しさん [sage] 2016/10/16(日) 21:34:44.24 ID:LWTFfjDf(3/12) AAS
>>590手? こういうことですか?
a() {
var n = 0;
return function () {
return ++n;
};
594(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:42:13.57 ID:LWTFfjDf(4/12) AAS
>>591なぜ返り値だけになるのですか?
var n = 0; も一緒じゃないんですか?
596: デフォルトの名無しさん [sage] 2016/10/16(日) 21:44:43.73 ID:LWTFfjDf(5/12) AAS
>>593「一番最初に起動したとき」というのは、
a(); // 1
のときでしょうか?
597: デフォルトの名無しさん [sage] 2016/10/16(日) 21:57:12.53 ID:LWTFfjDf(6/12) AAS
>>595それはどうやればいいのでしょうか?
参考書を読んでいるだけなので、デバッグの仕方もよく分かりません。
600(1): デフォルトの名無しさん [sage] 2016/10/16(日) 22:04:46.53 ID:LWTFfjDf(7/12) AAS
>>598598(4): デフォルトの名無しさん [sage] 2016/10/16(日) 21:57:36.43 ID:cgLhTvvH(3/5) AAS
function Counter() {
var n = 0;
return n;
}
var a = Counter();
この場合にaの中に何が入っているかわかるのなら、
>>586でaの中に何が入ってるかは
置き換えるだけだろ
aの中には、
var n = 0;
return n;
が入ってるのではないのですか?
なぜ、n = 0; は省かれるのですか?
601: デフォルトの名無しさん [sage] 2016/10/16(日) 22:12:37.29 ID:LWTFfjDf(8/12) AAS
>>600
間違えました。
aには返り値が入ります。なので、>>598の場合は、aにはnが入って、つまり返り値だけになるのは分かります。
しかし、a(); の場合は、
var n = 0;
return n;
なぜ、こうならないのかが分かりません。
604: デフォルトの名無しさん [sage] 2016/10/16(日) 22:32:07.26 ID:LWTFfjDf(9/12) AAS
あー、分かりました。
オブジェクトのコピーと混同してました。
var a = Counter();
確かにこれで、var n = 0; は入らないですね。返り値を代入しているだけだから。
すなわち、aには返り値の無名関数が入ると。
で、当然、a();には n = 0 は入ってなくて無名関数だけだから、呼ぶ度に加算される。
605: デフォルトの名無しさん [sage] 2016/10/16(日) 22:33:40.23 ID:LWTFfjDf(10/12) AAS
>>603603(1): デフォルトの名無しさん [sage] 2016/10/16(日) 22:26:43.07 ID:r3gdRhV6(2/2) AAS
>>594
>なぜ返り値だけになるのですか?
キミがCounter()をそのように作ったから
>var n = 0; も一緒じゃないんですか?
return function() {return n++;}
のどこにn=0がある?
今になって思えば、まさしくその通りです(笑)
606: デフォルトの名無しさん [sage] 2016/10/16(日) 22:35:45.09 ID:LWTFfjDf(11/12) AAS
>>598
何度もよく読み返してみて自分の誤解に気づきました。
ありがとうございます。
608: デフォルトの名無しさん [sage] 2016/10/16(日) 23:27:01.47 ID:LWTFfjDf(12/12) AAS
>>607出ました。これが!
function () {
return ++n;
}
よーし、明日からまた頑張るぞ!
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.224s*