[過去ログ] + 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
588(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:07:45.08 ID:cgLhTvvH(1/5) AAS
>>586
aの中に何が入っているか、書き出してみてごらん
書き出してみるには、どうすればいいのでしょうか?
592: デフォルトの名無しさん [sage] 2016/10/16(日) 21:34:44.24 ID:LWTFfjDf(3/12) AAS
>>590
590(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:27:41.70 ID:cgLhTvvH(2/5) AAS
>>589
手で
手? こういうことですか?

a() {
var n = 0;
return function () {
return ++n;
};
594
(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:42:13.57 ID:LWTFfjDf(4/12) AAS
>>591
591(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:33:14.24 ID:r3gdRhV6(1/2) AAS
>>586
a()は
function () {
return ++n;
};
でしょ
n = 0は実行されてない
なぜ返り値だけになるのですか?
var n = 0; も一緒じゃないんですか?
596: デフォルトの名無しさん [sage] 2016/10/16(日) 21:44:43.73 ID:LWTFfjDf(5/12) AAS
>>593
593(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:36:43.79 ID:CBxMhCnR(1) AAS
>>586
n = 0は一番最初に起動したときに
初期設定として入力されるだけで、あとはこれは呼び出されません
「一番最初に起動したとき」というのは、
a(); // 1
のときでしょうか?
597: デフォルトの名無しさん [sage] 2016/10/16(日) 21:57:12.53 ID:LWTFfjDf(6/12) AAS
>>595
595(1): デフォルトの名無しさん [sage] 2016/10/16(日) 21:42:56.22 ID:UhSHekdN(1) AAS
>>589
console.logかFunction#toString
それはどうやればいいのでしょうか?
参考書を読んでいるだけなので、デバッグの仕方もよく分かりません。
600
(1): デフォルトの名無しさん [sage] 2016/10/16(日) 22:04:46.53 ID:LWTFfjDf(7/12) AAS
>>598
598(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
>>603
603(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
607(1): デフォルトの名無しさん [sage] 2016/10/16(日) 22:57:07.10 ID:cgLhTvvH(5/5) AAS
あー、うん。そしてconsole.log(a)すれば
aの中身は表示されるよ。
出ました。これが!

function () {
return ++n;
}

よーし、明日からまた頑張るぞ!
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.224s*