| | 164 | |
| | 165 | === 割と本格的な関数型言語 === |
| | 166 | |
| | 167 | !JavaScript では、関数の定義内容を変数に代入することができます。 |
| | 168 | |
| | 169 | {{{ |
| | 170 | // 変数 hoge に関数を代入 |
| | 171 | var hoge = function(text) { |
| | 172 | alert("hoge: " + text); |
| | 173 | } |
| | 174 | |
| | 175 | // hoge に代入した関数を呼び出す |
| | 176 | hoge("fuga"); |
| | 177 | }}} |
| | 178 | |
| | 179 | かっこでうまく括ってやれば、わざわざ変数に代入せずとも、その場で呼び出してしまうことも可能です。 |
| | 180 | |
| | 181 | {{{ |
| | 182 | // 無名の関数を即座に呼び出す例 |
| | 183 | (function(text) { |
| | 184 | alert("hoge: " + text); |
| | 185 | })("fuga"); |
| | 186 | }}} |
| | 187 | |
| | 188 | こうして作られた無名関数は、'''クロージャ'''として機能します。つまり、無名関数が生成されたときの変数の値を覚えています[[FootNote(正確には、変数のスコープが失われたときの値を覚えています。この性質は若干ややこしいので、クロージャを用いる際には関数の生成の仕方に注意する必要があります。詳細は後述します。)]]。 |
| | 189 | |
| | 190 | {{{ |
| | 191 | // クロージャを生成する関数 |
| | 192 | function generateAlertClosure(text) { |
| | 193 | // 無名関数を返す |
| | 194 | return function() { |
| | 195 | alert(text); |
| | 196 | }; |
| | 197 | } |
| | 198 | |
| | 199 | var hoge = generateAlertClosure("ほげっ!"); |
| | 200 | var fuga = generateAlertClosure("ふんがーヽ(゚口゚ミ)ノ"); |
| | 201 | |
| | 202 | alert("まだ何も起こっていないはず…"); // ここまではまだ alert が呼ばれていないことを確認 |
| | 203 | |
| | 204 | hoge(); // ここで "ほげっ!" と表示 |
| | 205 | fuga(); // "ふんがー(ry" と表示 |
| | 206 | }}} |
| | 207 | |
| | 208 | [[FootNote]] |