# クロージャ勉強会 tags: `テーマ別勉強会` ホスト: @maeda ## メモ - @haruguchi - クロージャの雰囲気を掴む会 - 本格派の方は出てってくださいw ```javascript const counter = () => { let count = 0; const innerCount = () => { count += 1 return count } return innerCount } const piyo = couter() console.log(piyo()) //=> 1 console.log(piyo()) //=> 2 ``` 関数内部にある変数count と innerCount関数の関係 -> クロージャ クロージャの特徴 - 状態をもつ - カプセル化(countにはアクセスできない) - 静的スコープ(レキシカルスコープ) <-> 動的スコープ(ダイナミックスコープ) <レキシカルスコープスコープの説明> ```javascript! const x = 1 const hoge = () => { console.log(x); } const piyo = () => { const x = 100; hoge() } piyo() // => ??? 正解は1 ``` 右に行くほど外の環境 ``` func piyo内 → | func hoge  →| グローバル環境 x = 100      |   x未定義    | x = 1 ``` - @paru - クロージャの特徴 - 状態を保つことができる - 外部から変更できない変数(プライベートな変数)を持つことができる - レキシカル環境 - lexical・・・(特定の著者または一国語の)語彙(ごい)の、辞書(編集)の、辞書的な - javascriptにとってレキシカルスコープというのは、関数のスコープ内で限定的に使用できる擬似的な静的スコープ - - @マサラ #### 【目標】 - クロージャの雰囲気を掴む! #### 【導入】 - 変数と内部の関数の関係をクロージャ - クロージャの特徴 - 状態を持つことができる。 - カプセル化(プライベートな変数を持てる) mdn - [クロージャ \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures) #### 後で調べること レキシカルスコープ、静的スコープ - 実行された環境は関係ない - 最後はグローバル環境を参照する ダイナミックスコープ、動的スコープ カリー化 クラスがない時はクロージャで書いていた RubyもProcオブジェクトを使えばクロージャとして振る舞う