[過去ログ]
+ JavaScript の質問用スレッド vol.124 + (1002レス)
+ JavaScript の質問用スレッド vol.124 + http://mevius.5ch.net/test/read.cgi/tech/1636525464/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
7: デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102]) [sage] 2021/11/11(木) 11:19:40 ID:FWyFKZol0 前スレで誤字があったので訂正と クロージャーに関してわかりやすく説明しときます closerは誤りでclouserでした http://mevius.5ch.net/test/read.cgi/tech/1636525464/7
9: デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102]) [sage] 2021/11/11(木) 11:47:50 ID:FWyFKZol0 【クロージャー】 クロージャーはJSの関数に下記の仕組みを持たせるための要素のセットです ・関数内部をクローズにする(外部から直接アクセスできない) ・関数からは外部のプロパティにアクセスできる この仕組みを作るものがクロージャーです クロージャーの要素は、おおざっぱに関数自身、関数内情報、関数外部を参照するポインタで、 この要素のセットをクロージャーと呼びます 【外部ポインタの働きと内部情報の動きの確認】 <サンプルコード> function f1(){ let c=0;return c++; } function f2(){ let c=0;return ()=>{let s=0;return [c++,s++];} } let f3=f2() ; 1 f1() ;f1() ;console.log(f1()); 2 f2()();f2()();console.log(f2()()); 3 f3() ;f3() ;console.log(f3()); <結果出力> 1 c:0 2 c:0 s:0 3 c:2 s:0 ここで外部への参照ポインタをouterとします f1のクロージャーは、{関数f1 return c}{変数c}{outer(global} f2のクロージャーは、{関数f2 return function}{変数c}{outer(global} f2のアローの場合、 {無名 return [c,s]}{変数s}{outer(f2)} http://mevius.5ch.net/test/read.cgi/tech/1636525464/9
10: デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102]) [sage] 2021/11/11(木) 11:48:17 ID:FWyFKZol0 コード1では、f1を2回呼びますが、関数呼び出し1回につき、1つの(別々の)クロージャーが生成されます 同じ変数名のcであっても、別物のcとなります ですから、cはインクリメントされずに0となります コード2ではf2から戻されるアロー関数を複数回呼び出しますが 関数の呼び出し1回につき、別々のクロージャーが生成されますので 上記と同じようにcは0になります コード3では、f2から戻されるアロー関数を変数f3に代入し、それを複数回呼び出します 呼び出しのたびに別々のクロージャーが生成されますが 外部への参照は、outer(f2)なので、同じcを参照していますので 複数回呼び出すとcをインクリメントします 一方でアロー関数内の変数sは、コード1や2の説明と同じでインクリメントされません http://mevius.5ch.net/test/read.cgi/tech/1636525464/10
11: デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102]) [sage] 2021/11/11(木) 11:48:37 ID:FWyFKZol0 【関数はクロージャーか?】 クロージャーは関数ではありませんし 関数はクロージャーではありません 関数内をクローズにし、外部参照を持たせる、という仕組みをつくるための 関数、内部情報、外部参照ポインタのセットがクロージャーです 【言語は多数者が正しい】 f2で戻される無名関数をクロージャーと呼ぶ人がいるのは クロージャーの説明のために多用されていることで 無名関数をクロージャーと誤解してしまったり f1が外部からクローズ状態なので、f1がクロージャーなんだと そう理解してる人が多かったりしています クロージャーという言語の用法に関して 何が正しいのかは、それぞれの立場を主張する人数によって 決定することが正しいのかもしれません 以上で訂正とまとめを終わります http://mevius.5ch.net/test/read.cgi/tech/1636525464/11
12: デフォルトの名無しさん (ワッチョイ 5f21-+Epa [222.230.61.102]) [sage] 2021/11/11(木) 12:08:29 ID:FWyFKZol0 >>8 javascript.infoでは [ ]の前にセミコロンは想定していないため、前段と次段のコードが連続することが説明されてます console.log(1) [...'string'].forEach(console.log) は console.log(1)[...'string'].forEach(console.log) と同じ扱いで、1を出力したのち、エラーになります []を使うときに思い出してください http://mevius.5ch.net/test/read.cgi/tech/1636525464/12
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.025s