| 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]] |