Changes between Version 7 and Version 8 of HowTo/JavaScriptLanguageIntroduction


Ignore:
Timestamp:
Jul 31, 2010, 12:10:55 PM (14 years ago)
Author:
村山 俊之
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • HowTo/JavaScriptLanguageIntroduction

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