+ JavaScript の質問用スレッド vol.123 +at TECH
+ JavaScript の質問用スレッド vol.123 + - 暇つぶし2ch999:デフォルトの名無しさん (ワッチョイ 9e46-BvZE [111.98.111.65])
21/10/31 21:59:13.71 CEq1n28F0.net
>>991
がんばってくださいね
継続して学んでいれば今感じている疑問の殆どは解消します
一歩を進められたご自身の力を信じて進んでください

1000:デフォルトの名無しさん (ワッチョイ 9e46-BvZE [111.98.111.65])
21/10/31 22:09:03.92 CEq1n28F0.net
>>991
982の「疑問」=>「疑問や違和感」に訂正です

1001:デフォルトの名無しさん (ワッチョイ 56db-BvZE [217.178.96.78])
21/11/01 09:39:09.34 i0IYe4C60.net
アロ関は世界を救う。

1002:デフォルトの名無しさん (ワッチョイ 56db-BvZE [217.178.96.78])
21/11/01 09:56:32.75 i0IYe4C60.net
アロ関十段ここに極まる。

1003:デフォルトの名無しさん (ワッチョイ 52f0-rbIv [61.205.223.183])
21/11/01 10:30:03.91 Oy+9EmbD0.net
>>990
アロー関数にプロパティを紐づけする必要ないよな
無名関数、即時関数のプロパティに外部からアクセスするようなコードはナンセンスだし

>>991
Chromeのコンソールでコード入力してんのかな?
そんなことしてたら面倒くさいだろな
vscodeでjavascriptを実行すればいいんだけど
支障がるみたいで、どういう感じになってるのか興味ある

1004:デフォルトの名無しさん (ワッチョイ 9e46-BvZE [111.98.111.65])
21/11/03 17:47:47.22 mbwPounm0.net
.>>1000
そうだな、お前みたいな破廉恥極まりないやつを極刑にできないなんてな

1005:デフォルトの名無しさん (ワッチョイ 8701-rKqH [126.224.146.69])
21/11/03 17:55:09.21 KPYiFv2L0.net
>>997
先(>1000)をみる前に現在を見つめては

1006:デフォルトの名無しさん (ワッチョイ 7ff0-+Epa [61.205.223.183])
21/11/09 17:29:38.68 vBEqEZ0H0.net
よろしくお願いします

下記の二つの関数、c1()とc2()でカウンターを作りました
c1()はカウントされず、c2()はカウントされます
同じようなコードなのにc1()を複数回呼び出しても
変数cがインクリメントされないのはなぜなのでしょうか?

function c1(){
let c=0;
return c++;
}

function c2(){
let c=0;
return function(){return c++};
}

let s1=c1();
let s2=c2();

console.log(
s1, // 0
s1, // 0
s2(), // 0
s2(), // 1
);

1007:デフォルトの名無しさん (テテンテンテン MM4f-hQZx [133.106.48.148])
21/11/09 18:14:06.92 M98uPrZkM.net
仕様通りとしか
c1のcはc1が呼び出される度に定義されるからカウント不可
そもそも上のコードでc1は1回しか呼び出されていないし

1008:デフォルトの名無しさん (ワッチョイ ff02-H2rd [119.106.222.232])
21/11/09 18:42:53.53 /KO0GJnF0.net
c2の中のfunctionの中で書いてないけどcが定義されて、呼び出されるごとにそのcがインクリメントされているような挙動。

1009:デフォルトの名無しさん (ワッチョイ 5f01-lK5T [126.243.174.47])
21/11/09 20:03:23.50 zgMlwp7I0.net
>>999
c1は呼び出される度に変数cが初期化される
s2は呼び出されても変数cが初期化されない

1010:デフォルトの名無しさん (ワッチョイ df4e-9n+R [210.138.216.243])
21/11/09 20:54:12.85 qOqV7S2Y0.net
そもそもc1一回しか呼び出してないけどな

1011:デフォルトの名無しさん (ブーイモ MMa3-8Kye [202.214.125.68])
21/11/09 21:10:09.46 JS6FzrkbM.net
カウンタを初期化する部分を繰り返し呼び出す関数の外に出してやればいい

let c=0;
function c1(){
return c++;
}

1012:デフォルトの名無しさん (ワッチョイ ff46-H2rd [111.98.111.65])
21/11/09 22:41:36.85 RTTrqb1f0.net
>>1000はレキシカルを理解してるなら
s1とs2のレキシカルが違うことをだな

1013:デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102])
21/11/10 12:09:40.50 KxrU4/8D0.net
うむ

1014:デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102])
21/11/10 12:24:11.84 KxrU4/8D0.net
>>999
関数やブロックはプロパティをLexicalという場所に登録するんだけど
プロパティを参照した時には、関数内やブロック内のLexicalを参照し
そこにプロパティが登録されてないとその直外のLexicalを参照します

関数は、呼び出しごとに内部Lexicalが生成されるので
c1();c1();c1()と呼び出すと、別々の3つの内部Lexicalが生成され
それらに別々のlet cが登録されるので、c=0となります

s1にはc1()への関数の参照が格納されてるので
s1を複数回呼び出すと、c1()を複数回参照し
上記と同じ結果になります

一方でc2()がreturnで戻す内部関数は直外のLexicalのあるcを参照します
s2()を複数回呼び出すと、同じLexicalのcを参照するので
s2()の複数呼び出しでcはインクリメントされていくのですね

990先生や994先生のご指摘を血肉にされるといいでしょう

1015:デフォルトの名無しさん (ワッチョイ df4e-9n+R [210.138.216.243])
21/11/10 13:11:24.52 ABhSQgxq0.net
ところでクロージャーって用語の使い方について質問があるんだけどc2自体をクロージャーって言うのかc2が返してる無名関数をクロージャーって言うのかどっちが正しいの?

1016:デフォルトの名無しさん (ワッチョイ 7f52-hQZx [61.87.108.223])
21/11/10 15:30:26.98 jxD2VXPG0.net
質問中すまんが次スレ
+ JavaScript の質問用スレッド vol.124 +
スレリンク(tech板)

1017:デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102])
21/11/10 17:31:05.10 KxrU4/8D0.net
closer != function
closer == function + environment.information

JSで説明されてるクロージャーは
関数、関数の内部情報、外部参照ポインタのセット
っていう大まかな理解でいいと思います

function f(){let a;}の場合、
関数f、内部プロパティa、外部参照ポインタの参照先(グローバル)、というセットがクロージャー
ちょっと大まかすぎますか?

返される無名関数はクロージャーの仕組みを
コードで理解するために多用されているために
それ自体をクロージャーと認識する人も多いでしょう

また関数内プロパティは外部から直接アクセスできないので
外部からクローズになっているという意味で
関数自体をクロージャーといっていたり
外部から関数内にアクセスできない状態をクロージャーという人も多いでしょう


次スレで先生方からアドバイスいただけますといいですね
私も心待ちにしています

>>1009様、ありがとうございます

1018:1001
Over 1000 Thread Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1682日 18時間 0分 27秒

1019:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch