中心に、web技術について書いています2008-06-04関数のスコープとクロージャについてまとめjavascriptこないだ関数を勉強したときに飛ばしたクロージャについて調べたのでメモ。覚えるのがめんどいのであとまわし。おもしろWEBサービス開発日記クロージャの定義wikipediaにはこんな風に書いてあった。プログラミング言語において引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する関数のことである。Wikipediaサイ本にはこんな風に書いてあった。JavaScriptの関数は、実行するコードと、コードを実行するスコープを組み合わせたものです。コードとスコープが対になったものを、コンピュータサイエンスの分野ではクロージャと呼んでいます。そもそもスコープまわりがよくわかってないことに気づいた。スコープとは変数が特定の名前で参照される範囲。JavaScriptでは、スコープチェーンを使ってスコープを定義している。スコープチェーンとはスコープチェーンとは、オブジェクトを並べたもの。JavaScriptは、変数を探すときにスコープチェーンの先頭のオブジェクトのプロパティから探していく。関数外で定義された変数はグローバルオブジェクトから探索され、関数内で定義された変数は、まず関数のCallオブジェクトから探索されて、なければグローバルオブジェクトを探索する。スコープチェーンはどうやって定義されるんだろう?スコープチェーンが定義される順序JavaScriptインタプリタは、関数が呼び出されると、関数のスコープにまず関数定義時のスコープチェーンを設定する。下記の場合、hoge()関数が呼ばれたときに、まずfoo()関数のスコープチェーンを呼び出して設定するってこと。//...}次に、Callオブジェクトと呼ばれるオブジェクトを生成する。名前付きの引数をCallオブジェクトに定義var文で宣言されたローカル変数をCallオブジェクトに定義などが行われる。その後、Callオブジェクトをスコープチェーンの先頭に追加する。静的なスコープとは「実行時のスコープではなく、定義時のスコープを使うこと」を静的スコープというみたい。hoge()じゃないよ!ってことかな。すごく当たり前な気がする。foo();}そしてJavaScriptの関数は、全て静的なスコープ。JavaScriptで使われる「クロージャ」ここまでの内容だと、JavaScriptの関数は全てクロージャな気がするけど、どうも一般的なクロージャとJavaScriptで使われる「クロージャ」は少し意味が違うみたい。JavaScriptでは、入れ子型の関数が親の関数以外で使われたときに「クロージャを使った」と呼ばれるよう。どんなときにクロージャを使うといいんだろう?JavaScriptのクロージャ使用例その1下記のコードだと、外側からuniqueID.idを弄ることができてしまい嬉しくない。arguments.calee.id++;}なのでこんな風に「クロージャを使う」とidが隠蔽されて嬉しい。}}();JavaScriptのクロージャ使用例その2その1はいまいちわかりにくいのでもう一つ例を書きます。下記のmakeProperty()関数はクロージャを使って、valueを隠蔽しています。});o.setName("Frank");print(o.getName());終わりにまだ少し曖昧な部分があります。それ違うよって部分があったら突っ込みください。方法としては下記の三つがあるようです。2019で、再び綺麗なテストコードの書き方について発表した月別アーカイブ参加グループインターネットスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。